禁止特定的函数模板实例化

edA*_*a-y 10 c++

我想定义一个模板函数,但不允许使用特定类型进行实例化.请注意,通常允许所有类型并且通用模板有效,我只想禁止使用一些特定类型.

例如,在下面的代码中,我希望阻止使用double模板.这实际上并不会阻止实例化,但只是因为没有定义函数而导致链接器错误.

template<typename T>
T convert( char const * in )
{ return T(); }

//this way creates a linker error
template<>
double convert<double>( char const * in );

int main()
{
    char const * str = "1234";

    int a = convert<int>( str );
    double b = convert<double>( str );
}
Run Code Online (Sandbox Code Playgroud)

代码只是一个演示,显然转换函数必须做更多的事情.

问题:在上面的代码中,如何在尝试使用convert<double>实例化时产生编译器错误?


我能找到的最接近的相关问题是如何在模板实例化时故意造成编译时错误它处理的是类,而不是函数.

我需要这样做的原因是因为我希望阻止的类型实际上会编译并使用通用版本执行某些操作.但是,这不应该是函数合同的一部分,并且可能不会在所有平台/编译器和未来版本中受支持.因此,我想完全避免使用它.

whe*_*ies 3

我将在函数调用中使用静态断言来在函数实例化期间创建适当的失败:

template<typename T>
class is_double{ static const int value = false; }

template<>
class is_double<double>{ static const int value = true; }

template<typename T>
T convert( const char *argument ){
    BOOST_STATIC_ASSERT( !is_double<T>::value );
    //rest of code
}
Run Code Online (Sandbox Code Playgroud)

这应该在一个函数内工作。

  • C++11 现在有一个内置的 static_assert,不需要 boost。 (2认同)