2015-10-14 17 views
6

Considerare questo codice:eredità e variadic più modelli

#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; 
} 

Come possiamo vedere compilatore ci consente di ereditiamo dai parametri confezione. Ma quando potremmo aver bisogno di questa funzione? Come si usa correttamente?

Aggiornamento

voglio vedere alcuni casi di utilizzo come Nawaz ha fornito. L'unico caso d'uso che vedo - la progettazione basata su policy, ma non sarebbe meglio se ci applichiamo un elenco di politiche necessarie come:

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

Ma hai risposto da solo: 'Test test;' – SingerOfTheFall

+3

Ecco [un piccolo esempio] (https://github.com/snawaz/cson) che utilizza questa funzionalità .. e [questo è il file] (https://github.com/snawaz/cson/blob/master/include/cson/cson.h%2B%2B) che puoi guardare. Ed ecco [un esempio più grande e più complesso] (https://github.com/snawaz/tagsql) che usa questa funzionalità in modo esteso. – Nawaz

risposta

2

Un uso piacevole è la compilazione mappa tempo. Fare riferimento alla descrizione here.

È possibile combinare il suo utilizzo con policy based design per ottenere l'esplosione delle scelte nel fare classe.