0

我正在尝试替换模板上的虚拟功能:

struct Derived1;
struct Derived2;

template <typename T>
struct Base
{
    void f();
};

template<>
void Base::f<Derived1>(){std::cout<<"Derived1\n";}

template<>
void Base::f<Derived2>(){std::cout<<"Derived2\n";}


struct Derived1 : public Base {};
struct Derived2 : public Base {};

它一直有效,直到我们创建一个指针容器:

std::vector<Base*> vec;//doesn't work - needs explicit parameter for Base
vec.push_back(new Derived1);
vec[0]->f();//Call f() from Derived1

在这种情况下是否可以摆脱“虚拟性”?

4

1 回答 1

2

virtual函数调度可以在选择调用哪个函数之前确定对象的运行时动态类型。模板不能这样做,因为它们都是在编译时解析的。如果您有base *,则没有模板可以帮助回忆它是从哪个派生类型初始化的。

稍微偏离主题,函数模板专业化很少是一个好主意。重载更加灵活,因为编译器有一种机制可以选择最适合特定函数调用的重载。显式特化不会创建重载,而只会改变预先存在的通用模板的行为。它们是要求派送的最不灵活的方式。

于 2013-07-15T05:48:44.190 回答