gpt4 book ai didi

c++ - 禁止特定函数模板实例化

转载 作者:可可西里 更新时间:2023-11-01 16:16:33 28 4
gpt4 key购买 nike

我想定义一个模板函数,但不允许使用特定类型进行实例化。请注意,通常所有类型都是允许的并且通用模板可以工作,我只是想禁止使用一些特定类型。

例如,在下面的代码中我希望阻止使用 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 );
}

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

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


我能找到的最接近的相关问题是 How to intentionally cause a compile-time error on template instantiation它处理一个类,而不是一个函数。

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

最佳答案

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

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++ - 禁止特定函数模板实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5754660/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com