C++可变参数模板特化(和static_assert)

Dea*_*con 4 c++ templates variadic-templates

是否可以专门化这个模板声明:

template <class TYPE, class... ARGS> TYPE Foo(ARGS... args) { 
    static_assert(false);
}
Run Code Online (Sandbox Code Playgroud)

我尝试了一些例如:

template <> int Foo<int>(float args) {
    return 42;
}
Run Code Online (Sandbox Code Playgroud)

...但是当我尝试使用它时,我总是点击静态断言:

auto value = Foo<int>(1.5f);
Run Code Online (Sandbox Code Playgroud)

什么是正确的语法?

Bri*_*ian 6

只要未实例化,就不允许编写仅有效的模板.这违反了标准中的以下规则:

如果无法为模板生成有效的专业化,并且未实例化该模板,则模板格式错误,无需诊断.

另一方面,如果你体内有某些东西,那就好了

static_assert(sizeof(TYPE) != sizeof(int));
Run Code Online (Sandbox Code Playgroud)

在这种情况下,模板是有效的,并且您的代码将被编译,因为实际上将使用显式特化而不是主模板.请参阅http://coliru.stacked-crooked.com/a/238b979fd10c62c0