仅向上浇铸 我们都知道C++中的C型转换被认为是邪恶的。这就是为什么它们被const\u cast、static\u cast和dynamic\u cast所取代,以提供更多定制的转换,允许程序员只允许预期的转换类。到目前为止,一切顺利
但是,似乎没有内置语法来执行显式向上转换:这是一种在仅向上浇铸 我们都知道C++中的C型转换被认为是邪恶的。这就是为什么它们被const\u cast、static\u cast和dynamic\u cast所取代,以提供更多定制的转换,允许程序员只允许预期的转换类。到目前为止,一切顺利,c++,template-meta-programming,upcasting,C++,Template Meta Programming,Upcasting,但是,似乎没有内置语法来执行显式向上转换:这是一种在Base&baseRef=derived中显式执行其他隐式转换的方法,而不允许反向转换 虽然我知道这是一个很小的例子(大多数时候隐式转换工作得很好),但我想知道有什么技术可以实现这样的强制转换用户代码。我在想一些类似于 template<class T> class upcast { public: template<class U, typename = typename std::enable_if
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;
};
模板
类向上投射{
公众:
模板
向上投射(U值):值(值){}
运算符T(){返回值;}
私人:
T值;
};
然而,这似乎太复杂了,不太好,因为我不是模板元编程专家,我想问一下是否有不同的/更好的/更简单的方法。std::forward
只允许上传:
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
struct A{};
结构B:A{};
A A;
B B;
自动&x=std::正向(b);//好啊
自动&y=std::正向(a);//失败
auto*px=std::forward(&b);//好啊
auto*py=std::forward(&a);//失败
我不确定您在这里想要实现什么。您可以使用静态强制转换向上转换。您不能使用动态强制转换向上转换引用
或任何其他强制转换,因为引用
不能为空
,因此无法判断向上转换是否有效。@LibertyPaul我不确定您的意思。使用dynamic\u cast
向上转换总是成功的,当使用引用时,错误的向下转换将抛出std::bad\u cast
。您试图通过禁止隐式向上转换来解决什么问题?您正在尝试停止对象切片吗?