是否可以专门化这个模板声明:
template <class TYPE, class... ARGS> TYPE Foo(ARGS... args) {
static_assert(false);
}
我尝试了一些例如:
template <> int Foo<int>(float args) {
return 42;
}
...但是当我尝试使用它时,我总是点击静态断言:
auto value = Foo<int>(1.5f);
正确的语法是什么?
答案 0 :(得分:6)
您不能编写只有在未实例化的情况下才有效的模板。这违反了标准中的以下规则:
如果没有有效的专业化可以 为模板生成,并且该模板未实例化,模板格式错误,无法诊断 必需的。
另一方面,如果身上有某些东西,例如
,那就没问题了static_assert(sizeof(TYPE) != sizeof(int));
在这种情况下,模板是有效的,并且您的代码将被编译,因为实际上将使用显式特化而不是主模板。见http://coliru.stacked-crooked.com/a/238b979fd10c62c0
答案 1 :(得分:3)
作为州,false
与模板无关,因此static_assert
应该触发。
您可以在案件中使用= delete
:
template <class TYPE, class... ARGS> TYPE Foo(ARGS... args) = delete;
template <> int Foo(float) {return 42;}
答案 2 :(得分:-2)
您的静态断言不依赖于模板,因此它将始终触发。使用像
这样的东西template <class TYPE, class... ARGS> TYPE Foo(ARGS... args) {
static_assert(sizeof(TYPE) != sizeof(TYPE));
}