簡體   English   中英

如何折疊和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)...);
  }

您的嘗試看起來像是一元和二元折疊表達式的混合。 作為一元或二元折疊的表達式的正確 forms 是

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM