2015-10-14 57 views
6

考慮以下代碼:多重繼承和可變參數模板

#include <string> 
#include <iostream> 

class Foo 
{ 
protected: 
    void foo(){ std::cout << "foo" << std::endl; } 
}; 

class Bar 
{ 
protected: 
    void bar(){ std::cout << "bar" << std::endl; } 
}; 

template<typename... Args> 
class Test: public Args... 
{ 
public: 
    void test() 
    { 
      this->foo(); 
      this->bar(); 
    } 
}; 

int main(int argc, char** argv) 
{ 
    Test<Foo, Bar> test; 
    test.test(); 
    return 0; 
} 

正如我們所看到的編譯器允許我們從參數包繼承。但是,當我們需要這個功能?如何正確使用它?

更新

我想看到一些使用情況下,像Nawaz提供。 唯一的使用情況下,我看到 - 基於策略的設計,但如果我們像執行政策所需的列表會不會更好:

template<typename T, typename Policy1, typename Policy2, typename Policy3> 
class SomeClass: public Policy1, public Policy2, public Policy3 { ... }; 
+0

但是你已經回答了自己:'測試測試;' – SingerOfTheFall

+3

這是[使用這個特性的一個小例子](https://github.com/snawaz/cson).. [這是文件] (https://github.com/snawaz/cson/blob/master/include/cson/cson.h%2B%2B),你可以看看。這是[更大,更復雜的示例](https://github.com/snawaz/tagsql),廣泛使用此功能。 – Nawaz

回答

2

一個不錯的用法是編譯時的地圖。請參閱說明here

您可以將其用法與policy based design結合起來,以在課堂製作中實現選擇的激增。