如何確保第二個參數使用第一個參數作爲模板中的第一個參數?
您以這種方式使用它。
這是一個正確的語法:
template <class T, template <class U> class V>
class Container {
using contain_type = V<T>;
};
但參數U
是可選的,不會宣佈任何實際的模板參數。 (很像void f(int* p);
相同void f(int*);
,並在第一次申報的p
不聲明任何實際的對象。)
所以,你也可以同樣寫:
template <class T, template <class> class V>
class Container {
using contain_type = V<T>;
};
很快儘管如此,您可能會遇到上述聲明中的問題:您不能將其與std::vector
,std::list
,std::set
等等一起使用。這是因爲它們不是僅具有一個模板參數的模板。由於默認的模板參數,std::vector<int>
確實是std::vector<int, std::allocator<int>>
,std::set<int>
是std::set<int, std::less<int>, std::allocator<int>>
,依此類推。
要解決這個問題,你需要第二個參數來匹配可變參數模板:
template <class T, template<class...> class V>
class Container {
using contain_type = V<T>;
};
這仍然只允許模板只有類型參數,但是這是一個好了很多。
現在,例如,您可以使用Container<int, std::vector>
作爲類型。