使用模板的动态多态行为?

时间:2014-07-04 12:04:31

标签: c++ templates polymorphism

几年前,在一次采访中,我看到了一些看起来很可怕的代码,它们与动态多态性具有相同的行为但使用了模板。我不是指模板的正常使用。

如何使用模板实现与运行时多态性等效的行为?

更新:我认为这与此有关:

http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern#Static_polymorphism

1 个答案:

答案 0 :(得分:0)

使用奇怪的循环模板模式(CRTP),您可以实现类似 编译时多态性 的类似功能。这是一个简单的例子:

template<typename DERIVED>
struct base
{
public:
    void f() const
    {
        static_cast<DERIVED&>( *this ).f_();
    }
};

struct derived1 : public base<derived1>
{
    void f_() const
    {
        std::cout << "Derived1!\n";
    }
};

struct derived2 : public base<derived2>
{
    void f_() const
    {
        std::cout << "Derived2!\n";
    }
};

template<typename DERIVED>
void call( const base<DERIVED>& e )
{
    e.f(); //compile-time resolved (Possibly inlined) polymorphic call here
}

int main()
{
    derived1 d1;
    derived2 d2;

    call( d1 );
    call( d2 );
 }

以上代码输出:

  

derived1!
  Derived2的!