仅用于向上转换
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
我们都知道 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