2015-10-14 18 views
6

xem xét mã này:đa kế thừa và variadic mẫu

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

Như chúng ta có thể thấy trình biên dịch cho phép chúng ta kế thừa từ gói tham số. Nhưng khi chúng ta có thể cần tính năng này? Làm thế nào để sử dụng nó đúng cách?

Cập nhật

Tôi muốn nhìn thấy một số trường hợp sử dụng như Nawaz đã cung cấp. Việc sử dụng trường hợp duy nhất tôi nhìn thấy - thiết kế dựa trên chính sách, nhưng sẽ không phải là tốt hơn nếu chúng tôi thực thi một danh sách các chính sách cần thiết như:

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

Nhưng bạn đã tự trả lời: 'Thử nghiệm kiểm tra; ' – SingerOfTheFall

+3

Đây là [một ví dụ nhỏ] (https://github.com/snawaz/cson) sử dụng tính năng này .. và [đây là tệp] (https://github.com/snawaz/cson/blob/master/include/cson/cson.h%2B%2B) mà bạn có thể xem. Và đây là [một ví dụ lớn hơn, phức tạp hơn] (https://github.com/snawaz/tagsql) sử dụng tính năng này rộng rãi. – Nawaz

Trả lời

2

Một sử dụng tốt đẹp là biên dịch đồ thời gian. Tham khảo mô tả here.

Bạn có thể kết hợp việc sử dụng của nó với policy based design để đạt được sự bùng nổ của các lựa chọn trong quá trình tạo lớp học.