這個問題的通用模板函數如下這樣:Function overloading and template deduction priority阻止所有模板派生類型
考慮以下類:
template<typename T1, typename T2>
class Base {};
class Derived0 : public Base<double, double> {};
template<typename T1, typename T2, typename T3>
class Derived1 : public Base<T1, T2> {};
template<typename T1, typename T2, typename T3, typename T4>
class Derived2 : public Base<T3, T4> {};
而以下功能:
template<typename T> f(const T& x); // version A
template<typename T1, typename T2> f(const Base<T1, T2>& x); // version B
我的問題f(double)
會叫version A
(ok),f(Base<double, double>)
會叫version B
(ok),但是f(Derived1<double, double, double>)
將打電話給version A
(請參閱開頭的其他問題的鏈接)。
使用C++ 11,如何阻止version A
和力version B
爲Base<T1, T2>
任何T1
和T2
所有派生成員是誰?
注意:如果可能,我想避免添加助手類,並希望添加成員到提供的類。
東西是不防火,但在大多數情況下工作,並且很短:http://codepad.org/HkfK7TfQ –
什麼是T :: Base?構造函數? (+在什麼情況下它不會工作)? – Vincent
當T不通過定義一個名爲'Base'的成員來隱藏它時,'T :: Base'是'Base'的繼承注入類名。如果'T'本身是'Base ',那麼'T :: Base'命名構造函數(但SFINAE注意那麼'f'也被忽略)。 –