动态转换基类到子类的泛型函数

Generic function for dynamic casting base class to child class

提问人:Vivek Mangal 提问时间:8/1/2023 最后编辑:Vivek Mangal 更新时间:8/1/2023 访问量:67

问:

我正在处理一个C++项目,我有一个基类A,它可以有许多派生类,如B,C等。

如果可能的话,我想为动态基类编写一个泛型函数到任何子类。所以我写了以下函数:

template<typename T>
optional<T> A::get_if_convertible()
{
    optional<T> return_val = none;
    using converted_ptr_type = typename std::add_pointer<T>::type;
    auto ptr = dynamic_cast<converted_ptr_type>(this);
    if (ptr)
        return_val = dynamic_cast<T>(ptr);
    return return_val;
}

我需要的是,如果是指向对象的指针,那么我返回的派生类对象也应该是.这是动态铸造的正确方法吗?如果指针指向对象,如何处理这种情况?thisconstconstthisconst

C++ 模板 继承 动态强制转换

评论

0赞 Jarod42 8/1/2023
是否要对象切片?为什么,而(使用指针)在强制转换不匹配时可能已经返回。std::optionaldynamic_castnullptr
0赞 Vivek Mangal 8/1/2023
我实际上希望客户要么得到具体(派生)对象,要么不得到。所以可选似乎是更好的选择。假设我有常量 A*。如果它指向类型 B,则应返回 B 类型对象(而不是切片)并保持其恒度。另外get_if_convertible()是我的内部函数,客户端会调用诸如-可选的get_B()之类的函数;
1赞 chrysante 8/1/2023
除了这不是有效的 C++ 并且您的(伪代码)函数总是返回的事实之外,我看不出与原始接口相比如何提供任何附加值。如果你有一个指针,则给你一个 类型的指针。此指针将指向实际对象(如果指向对象)或 be(如果不指向对象)。所以已经保持了恒常性。nonedynamic_castconst A* pdynamic_cast<B const*>(p)const B*BpBnullptrpBdynamic_cast
0赞 Alan Birtles 8/1/2023
当您无论如何都要返回对象的副本时,偶数是否重要?const
1赞 Alan Birtles 8/2/2023
取消引用未设置的可选项与取消引用 null 指针一样未定义。啊,可选指针没有多大意义

答:

0赞 Vivek Mangal 8/1/2023 #1

根据专家对问题的评论,我实现了以下通用函数:

template <typename T>
T* A::get_if_convertible() {
    return dynamic_cast<T*>(this);
}

template <typename T>
const T* A::get_if_convertible() const {
    return dynamic_cast<const T*>(this);
}

客户端只需编写以下代码,即可调用相应的版本:fun()

void fun(const B* b);
    
void fun(B* b);

int main()
{
    auto ptr_A = get_A_ptr();
    fun(ptr_A->get_if_convertible<B>());
}

谢谢大家的帮助。