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

时间:2018-08-23 20:13:03

标签: c++ templates c++14 variadic-templates template-meta-programming

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

static_assert(sum_size(std::tuple<int, bool>) == 5, "not 5!");

This不能直接回答我的问题,因为DoSomething不是constexpr函数。我需要在编译时调用DoSomething。也许有人可以解释如何将boost::fusion::for_eachstatic_assert()一起使用?

1 个答案:

答案 0 :(得分:5)

  

是否有可能使用constexpr函数来计算元组元素类型的大小之和,其用法如下:

为什么不呢?

不幸的是,您已经标记了C ++ 14。

在C ++ 17中要简单得多(感谢模板折叠)

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

在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;
 }

在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)...>(); }

但是您必须更正用法

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