c – 禁止特定的功能模板实例化

c – 禁止特定的功能模板实例化,第1张

概述我想定义一个模板函数,但不允许使用特定类型的实例化.请注意,通常所有类型都是允许的,通用模板可以使用,我只是想禁止使用一些特定的类型. 例如,在下面的代码中,我希望防止与模板双重使用.这实际上并不阻止实例化,但是通过不定义函数来引起链接器错误. template<typename T>T convert( char const * in ){ return T(); }//this way 我想定义一个模板函数,但不允许使用特定类型的实例化.请注意,通常所有类型都是允许的,通用模板可以使用,我只是想禁止使用一些特定的类型.

例如,在下面的代码中,我希望防止与模板双重使用.这实际上并不阻止实例化,但是通过不定义函数来引起链接器错误.

template<typename T>T convert( char const * in ){ return T(); }//this way creates a linker errortemplate<>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}

这应该在一个功能中工作.

总结

以上是内存溢出为你收集整理的c – 禁止特定的功能模板实例化全部内容,希望文章能够帮你解决c – 禁止特定的功能模板实例化所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1233208.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存