我想定义模板函数,但不允许使用特定类型实例化。请注意,通常所有类型都是允许的,并且通用模板可以工作,我只想禁止使用一些特定的类型。禁止特定函数模板实例化
例如,在下面的代码中,我希望阻止使用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<double>
实例化时,编译器错误?
我能找到的最接近的相关问题是How to intentionally cause a compile-time error on template instantiation它涉及一个类而不是函数。
我需要这样做的原因是因为我希望阻止的类型实际上会编译并使用通用版本进行操作。然而,这不应该是该功能合同的一部分,并且可能在所有平台/编译器和未来版本中都不支持。因此,我想阻止使用它。
您已经这样做了,是吗? – Nawaz 2011-04-22 11:00:07
不,这会导致关于缺少函数的链接器错误。这个错误不会告诉你问题在哪里,它只会告诉你它在哪个模块中。 – 2011-04-22 11:05:20
你可以使用'static_assert'触发一个编译时错误:'template <> foo(const char *) {static_assert(false,“不允许”); }' –
evnu
2011-04-22 11:10:38