繼承

2015-07-28 86 views
2

我想提出兩個模板類型的組合的繼承像這樣的例子類:繼承

#include <vector> 
#include <set> 

template<typename T, typename Base=std::vector<T>> 
class A : public Base 
{ 
}; 

int main() 
{ 
    A<int> a; 
    A<int, std::set<int>> b; 

    return 0; 
} 

但現在,我想能夠寫

A<int, std::set> b; 

代替

A<int, std::set<int>> b; 

我怎麼能這樣做嗎? 謝謝! :)

解決方案從@Piotr S.

在這裏,我轉貼由彼得S.給予所以這個非常漂亮的答案很容易找到其他人(不要忘記把票投給他的答案的完整解決方案: - P):

#include <vector> 
#include <set> 
#include <utility> 
#include <iostream> 

template <template <typename...> class> struct tag {}; 

template <typename T, template <typename...> class Base = std::vector> 
class A : public Base<T> 
{ 
public: 
    void add(const T& t) 
    { 
     return _add(tag<Base>{}, t); 
    } 

private: 
    void _add(tag<std::set>, const T& t) 
    { 
     std::cout << "set\n"; 
     Base<T>::insert(t); 
    } 

    void _add(tag<std::vector>, const T& t) 
    { 
     std::cout << "vector\n"; 
     Base<T>::push_back(t); 
    } 
}; 

int main() 
{ 
    A<int> a; 
    A<int, std::set> b; 

    a.add(1); 
    b.add(1); 
} 
+0

是的,我卡住了這個錯誤,但我不知道是否有很好的解決方案來解決這個問題.. – StormRider

+0

嘛pparently有:)我也沒有意識到這一點:) –

回答

2
#include <vector> 
#include <set> 

template <typename T, template <typename...> class Base = std::vector> 
class A : public Base<T> 
{ 
}; 

int main() 
{ 
    A<int> a; 
    A<int, std::set> b; 
} 

DEMO

+0

顯然我對此的評論是不可能的,因爲編譯將失敗,因爲缺少模板參數是完全的,我錯了,我沒有意識到這一點: )這隻能在C++ 14中工作嗎? MSVC 2012拒絕編譯這個。 –

+1

工程就像一個魅力!謝謝! – StormRider

+0

@RudolfsBundulis它僅使用C++ 11功能,MSVC 2012不完全符合C++ 11 –