C++可变参数模板专用化(和static_assert)
C++ variadic template specialization (and static_assert)
是否可以专门化此模板声明:
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));
}
相关文章:
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 收到错误"invalid use of non-static data member 'stu::n' "
- LNK1104:无法打开libpjproject-i386-Win32-vc14-Debug-Static.lib
- 我应该在 C++ 中何时/为什么使用 STATIC?
- 在VS2019项目中集成ImageMagick:x64-windows-static library
- 如何在 assert() 和 static_assert() 之间调度,如果在 constexpr 上下文中依赖?
- 如何处理Boost Spirit X3导致Visual Studio 2019 "static initialization order fiasco"?
- 我关于函数"Assert"的C++代码有问题
- "static char __ = []() -> char"的含义
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- 无法在 DLL 中链接 SDL2-static.lib
- 如何摆脱C++中未解析的外部符号"private: static char"错误?
- assert() 在发布模式下充当标识函数吗?
- 如何编写一个接受如下断言消息的自定义断言函数:assert(false) << "assertio
- C++线程"Call to non-static member function without an object argument"
- 出现这种错误的原因是什么"invalid use of non-static data member "
- static是如何使用ClassA::m_variable处理所有类对象的
- LNK2001:未解析的外部符号public:static类std::vector
- static assert - C++ concepts vs static_assert