我有一个名为function
的简单函数,例如带有以下签名:
class Type { /* ... */ };
bool function( const Type& aValue ) { /* ... */ return true; }
我有一些其他的类,我想重载上面提到的函数,以便只有派生自Base
的类才能使用它:
class Base { /* ... */ };
class Derived : public Base { /* ... */ };
template < typename T >
bool function( const typename std::enable_if< std::is_base_of< Base, T >::value, T >::type& aValue ) { /* ... */ return true; }
如果我像这样使用它,它工作正常:
Derived object;
function< Derived >( object );
但如果我离开模板参数,我会得到上面提到的错误(无法推断出模板参数):
Derived object;
function( object ); // Compilation error (C2664).
我可以留下模板参数吗?
(MSVC 2012)
答案 0 :(得分:4)
通过引入嵌套名称说明符(<T>::
),您可以在T
上禁止模板类型扣除。
那就是说,你必须通过将enable_if
放在其他地方来推断出参数表达式类型,例如,在返回类型语法中:
template <typename T>
auto function(const T& aValue)
-> typename std::enable_if<std::is_base_of<Base, T>::value, bool>::type
{
return true;
}
或在模板类型参数列表中:
template <typename T, typename = typename std::enable_if<std::is_base_of<Base, T>::value>::type>
bool function(const T& aValue)
{
return true;
}