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

C++ variadic template specialization (and static_assert)

本文关键字:static assert 专用 变参 参数 C++      更新时间:2023-10-16

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

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

正确的语法是什么?

不允许编写仅在未实例化时才有效的模板。这违反了标准中的以下规则:

如果没有有效的专业化可以 为模板生成,并且该模板未实例化,模板格式不正确,无诊断 必填。

另一方面,如果你体内有一些东西,比如

static_assert(sizeof(TYPE) != sizeof(int));
在这种情况下,模板

是有效的,并且您的代码将进行编译,因为实际上将使用显式专用化而不是主模板。请参阅 http://coliru.stacked-crooked.com/a/238b979fd10c62c0

作为状态,false与模板无关,因此static_assert应触发。

您可以在以下情况下使用= delete

template <class TYPE, class... ARGS> TYPE Foo(ARGS... args) = delete;
template <> int Foo(float) {return 42;}

演示

静态断言不依赖于模板,因此它将始终触发。使用类似的东西

template <class TYPE, class... ARGS> TYPE Foo(ARGS... args) { 
    static_assert(sizeof(TYPE) != sizeof(TYPE));
}