【发布时间】:2018-02-01 14:45:17
【问题描述】:
我一直在寻找一种同时使用模板和多态的方法。这是我的问题的简化版本:
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
//*******************************************************************
//*******************************************************************
struct DerivedStuff1
{
static void eval() { cout << "evaluating DerivedStuff1" << endl; }
};
struct DerivedStuff2
{
static void eval() { cout << "evaluating DerivedStuff2" << endl; }
};
//*******************************************************************
//*******************************************************************
class BaseClass
{
public:
template<typename StuffType> virtual void eval() const = 0;
};
class DerivedClass1 : public BaseClass
{
public:
template<typename StuffType> virtual void eval() const
{
std::cout << "We are in DerivedClass1: ";
StuffType::eval();
}
};
class DerivedClass2 : public BaseClass
{
public:
template<typename StuffType> virtual void eval() const
{
std::cout << "We are in DerivedClass2: ";
StuffType::eval();
}
};
int main()
{
BaseClass* c1 = new DerivedClass1;
c1->eval<DerivedStuff1>();
c1->eval<DerivedStuff2>();
BaseClass* c2 = new DerivedClass2;
c2->eval<DerivedStuff1>();
c2->eval<DerivedStuff2>();
return 0;
}
此代码无法编译,因为 C++ 中不允许使用虚拟模板函数。我找到了一些解决这个问题的方法(CRTP 等),但没有一个是真正令人满意的。有没有优雅的方法来解决这个问题?
【问题讨论】:
-
可以制作类模板并在里面使用虚函数
-
@SemyonBurov - 但模板是特定于方法的;如何解决制作类模板的问题?
-
为什么需要
eval()virtual? -
您可以通过手动创建一个 vtable(使用
map<string, function_ptr>)并使用typeid(T).name()关闭正确的方法来完成某些操作。然而,这将是 slooooow。 -
eval()的模板类型在某种程度上是相关的?DerivedStuff1、DerivedStuff2等有一个通用的基(虚拟?)类?
标签: c++ function templates polymorphism virtual