仅用于向上转换

Cast for upcasting only

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

然而,这似乎太复杂了,而且由于我不是模板元编程方面的专家,所以我想问一下是否有 different/better/simpler 方法。

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