只能用于向上转型的类型转换

5
我们都知道在C++中,C-style转换是被认为是不好的。因此,它们被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;
};

然而,那似乎太复杂了,而且由于我不是模板元编程的专家,我想问是否有不同/更好/更简单的方法。

2
我不确定你在这里想要实现什么。你可以使用 static_cast 进行向上转换。 - Tom Tanner
2
@LibertyPaul,我不确定你的意思。使用dynamic_cast进行向上转型始终成功,而错误的向下转型在使用引用时会抛出std::bad_cast异常。 - TartanLlama
你试图通过禁止隐式向上转换来解决什么问题?你是想阻止对象切片吗? - NathanOliver
我没有看到 OP 要求禁止向上转型。他们正在寻求一种构造,在其中这是有效的 upcast<Base&>(my_derived);,但这不是 upcast<Derived&>(my_base);。也就是说,他们想要禁止向下转型。 - TartanLlama
3
http://www.boost.org/doc/libs/1_39_0/boost/implicit_cast.hpp - Igor Tandetnik
显示剩余2条评论
1个回答

3

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接