如何折叠和static_assert所有参数?

How to fold and static_assert all parameters?

以下不编译:

  template<typename... Args>
  void check_format(Args&&... args)
  {
      static_assert((true && std::is_fundamental<decltype(args)>::value)...);
  }

您的尝试看起来像是一元和二元折叠表达式的混合体。一元或二元折叠的表达式的正确形式是

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>

这应该有效:

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