C++中元组元素类型的大小总和

Ale*_*sky 1 c++ templates template-meta-programming variadic-templates c++14

是否可以使用以下用法constexpr计算std::tuple元素类型的大小总和的函数:

static_assert(sum_size(std::tuple<int, bool>) == 5, "not 5!");
Run Code Online (Sandbox Code Playgroud)

不直接回答我的问题,因为DoSomething不是constexpr功能.我需要在编译时调用DoSomething.或者也许有人能解释如何使用boost::fusion::for_eachstatic_assert()

max*_*x66 6

是否可以使用constexpr函数计算元组元素类型的大小总和,具有以下用法:

为什么不.

不幸的是,你已经标记了C++ 14.

在C++ 17中更简单(感谢模板折叠)

template <typename ... Ts>
constexpr std::size_t sum_size (std::tuple<Ts...> const &)
 { return ( sizeof(Ts) + ... ); }
Run Code Online (Sandbox Code Playgroud)

在C++ 14中,您可以编写.

template <typename ... Ts>
constexpr std::size_t sum_size (std::tuple<Ts...> const &)
 {
   using unused = std::size_t[];

   std::size_t  ret {};

   (void)unused { 0u, ret += sizeof(Ts)... };

   return ret;
 }
Run Code Online (Sandbox Code Playgroud)

前C++ 14(C++ 11)你必须使用递归,这是一个可能的解决方案

template <typename = void>
constexpr std::size_t sum_helper ()
 { return 0u; }

template <std::size_t I0, std::size_t ... Is>
constexpr std::size_t sum_helper ()
 { return I0 + sum_helper<Is...>(); }

template <typename ... Ts>
constexpr std::size_t sum_size (std::tuple<Ts...> const &)
 { return sum_helper<sizeof(Ts)...>(); }
Run Code Online (Sandbox Code Playgroud)

但你必须纠正用法

// .........................................VV
static_assert(sum_size(std::tuple<int, bool>{}) == 5, "not 5!");
Run Code Online (Sandbox Code Playgroud)