以下内容无法编译:
template<typename... Args>
void check_format(Args&&... args)
{
static_assert((true && std::is_fundamental<decltype(args)>::value)...);
}
以下内容无法编译:
template<typename... Args>
void check_format(Args&&... args)
{
static_assert((true && std::is_fundamental<decltype(args)>::value)...);
}
这应该有效:
static_assert((std::is_fundamental_v<Args> && ...));
Godbolt 的更长示例:https ://gcc.godbolt.org/z/9yNf15
#include <type_traits>
template<typename... Args>
constexpr bool check_format(Args&&... args)
{
return (std::is_fundamental_v<Args> && ...);
}
int main() {
static_assert(check_format(1, 2, 3));
static_assert(check_format(nullptr));
static_assert(!check_format("a"));
static_assert(check_format());
struct Foo {};
static_assert(!check_format(Foo{}));
}
您的尝试看起来像是一元和二元折叠表达式的混合。作为一元或二元折叠的表达式的正确形式是
static_assert((... && std::is_fundamental<decltype(args)>::value)); // unary
static_assert((true && ... && std::is_fundamental<decltype(args)>::value)); // binary
一元形式有效,因为空序列隐式等效于true
.
顺便说一句,decltype(args)
总是会是一个引用类型,无论是左值还是右值。您可能希望std::remove_reference_t
从这些类型中获取。并且您也可以使用std::remove_reference_t<Args>
以方便编写。