仅适用于向上转播

时间:2016-08-08 13:20:35

标签: c++ template-meta-programming upcasting

我们都知道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;
};

然而,这看起来太复杂了,因为我不是模板元编程方面的专家,我想问一下是否有不同/更好/更简单的方法。

1 个答案:

答案 0 :(得分:2)

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