Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅向上浇铸 我们都知道C++中的C型转换被认为是邪恶的。这就是为什么它们被const\u cast、static\u cast和dynamic\u cast所取代,以提供更多定制的转换,允许程序员只允许预期的转换类。到目前为止,一切顺利_C++_Template Meta Programming_Upcasting - Fatal编程技术网

仅向上浇铸 我们都知道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
。您试图通过禁止隐式向上转换来解决什么问题?您正在尝试停止对象切片吗?