我想定义一个模板函数,但不允许使用特定类型的实例化.请注意,通常所有类型都是允许的,通用模板可以使用,我只是想禁止使用一些特定的类型.
例如,在下面的代码中,我希望防止与模板双重使用.这实际上并不阻止实例化,但是通过不定义函数来引起链接器错误.
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 ); }
问题:在上面的代码中,当尝试使用转换< double>实例?
最接近的相关问题是可以找到的是How to intentionally cause a compile-time error on template instantiation它处理一个类,而不是一个函数.
我需要这样做的原因是因为我希望阻止的类型实际上会编译并使用通用版本执行某些操作.然而,这不应该是功能合同的一部分,并且可能不会在所有平台/编译器和将来的版本中得到支持.所以我想防止使用它.
解决方法
我将在函数调用过程中使用一个静态断言来在函数实例化过程中创建正确的失败:
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 }
这应该在一个功能中工作.