我们都知道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;
};
然而,这看起来太复杂了,因为我不是模板元编程方面的专家,我想问一下是否有不同/更好/更简单的方法。
答案 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