仅用于向上投射

cmaster-恢复莫妮卡

我们都知道,C风格的强制转换在C ++中被认为是邪恶的。这就是为什么将它们替换为const_cast<>static_cast<>dynamic_cast<>提供更多定制的转换的原因,从而使程序员仅允许预期的转换类。到现在为止还挺好。

但是,似乎没有内置语法来执行显式的向上转换:一种在不允许反向的情况下Base& baseRef = derived显式地执行否则为隐式转换的方法

虽然我知道这是一个很小的极端情况(大多数情况下隐式转换可以正常工作),但我想知道有哪些技术可用于在用户代码中实现这种转换。我在想一些类似的事情

template<class T>
class upcast {
    public:
        template<class U, typename = typename std::enable_if<std::is_convertible<U, T>::value>::type>
        upcast(U value) : value(value) {}
        operator T() { return value; }
    private:
        T value;
};

但是,这似乎太复杂了,以至于不好,而且由于我不是模板元编程的专家,所以我想问一问是否有不同/更好/更简单的方法。

恶魔

std::forward<T&> 仅允许上播:

struct A {};
struct B : A {};
A a;
B b;
auto& x = std::forward<A&>(b); // OK
auto& y = std::forward<B&>(a); // fails
auto* px = std::forward<A*>(&b); // OK
auto* py = std::forward<B*>(&a); // fails

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章