我们都知道C风格的演员在C中被认为是邪恶的.这就是为什么它们被const_cast<> ;, static_cast<>和dynamic_cast<>取代的原因.提供更多的定制投射,允许程序员只允许预期的转换类.到现在为止还挺好.
但是,似乎没有内置语法来执行显式向上转换:在Base& ;;中执行其他隐式转换的方法. baseRef =显式派生而不允许反向.
虽然我知道这是一个相当小的极端情况(大多数时候隐式转换工作得很好),但我想知道在用户代码中实现这样的强制转换有哪些技术可用.我正在考虑的事情
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 ::向前< 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