c++ - 调用派生类的模板函数

标签 c++ templates derived boost-serialization

我在 C++ 中遇到一个问题,即在具有指向基类的指针时调用派生类的函数。

编辑: 一些答案让我引用了 CRTP

但我的观点是我需要一个指向“Base*”类而不是“Base*”的指针,因为我不知道当前正在处理的类型(当前实例是从某种工厂创建的) .

类:

class Base 
{
..
template<typename T>
func (T arg) { ... };
};

class Derived1 : public Base
{
...
template<typename T>
func (T arg) { ... };
};


class Derived1 : public Base
{
...
template<typename T>
func (T arg) { ... };
};

用法:

int main()
{
   Base* BasePtr = new Derived1();

   // The expected function to be called is Derived1::func<int>()
   BasePtr->func<int>();

   return 0; // :)
}

我无法将 func 设为虚拟,因为该语言不支持虚拟模板函数。

仅当类具有模板参数时才允许,但如果其中的函数具有模板参数则不允许。

我在 Boost.Serialization 中看到了类似的问题,但无法理解该解决方案。

谢谢,

科比梅尔

最佳答案

实现Curiously recurring template pattern(CTRP) .

插图:

template<typename D>
class Base 
{
public:
    template<typename T>
    void func (T arg) 
    {
         static_cast<D*>(this)->func(arg);
    }
};

class Derived1 : public Base<Derived1>
{
public:
    template<typename T>
    void func (T arg) { /*...*/ }
};


Base<Derived1> *basePtr = new Base<Derived1>();
basePtr->func(100);

关于c++ - 调用派生类的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6026707/

相关文章:

c++ - 错误 C2512 'DerivedClass' : no appropriate default constructor available

c++ - 模板和隐式构造函数的类定义之外的友元声明

c++ - 将 C 风格的字符串复制到空闲存储区分配的内存中?

c++ - 在白色背景上绘制球体(C++ 和 OpenGL)

c++ - 当我使用模板时,编译器无法将函数的返回类型从 double 转换为 int

drupal - 主题和模板有什么区别?

C++:我可以编写一个从 T 派生的模板类吗?

c++ - 为什么 lsof 不显示 libstdc++ 已加载到 Mac OS X 上?

c++ - 使用可变参数模板调用成员函数

c# - 派生类数组,调用方法?