加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:52:57 所属栏目:百科 来源:网络整理
导读:我想定义一个模板函数,但不允许使用特定类型的实例化.请注意,通常所有类型都是允许的,通用模板可以使用,我只是想禁止使用一些特定的类型. 例如,在下面的代码中,我希望防止与模板双重使用.这实际上并不阻止实例化,但是通过不定义函数来引起链接器错误. templa
我想定义一个模板函数,但不允许使用特定类型的实例化.请注意,通常所有类型都是允许的,通用模板可以使用,我只是想禁止使用一些特定的类型.

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

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
}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读