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

时间:2016-07-12 22:13:34

标签: c++ templates variadic-templates

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

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);

正确的语法是什么?

3 个答案:

答案 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;}

Demo

答案 2 :(得分:-2)

您的静态断言不依赖于模板,因此它将始终触发。使用像

这样的东西
template <class TYPE, class... ARGS> TYPE Foo(ARGS... args) { 
    static_assert(sizeof(TYPE) != sizeof(TYPE));
}