我们都知道,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] 删除。
我来说两句