这个问题的通用模板函数如下这样: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'也被忽略)。 –