是否可以使用constexpr
函数来计算std::tuple
元素类型的大小之和,其用法如下:
static_assert(sum_size(std::tuple<int, bool>) == 5, "not 5!");
?
This不能直接回答我的问题,因为DoSomething不是constexpr函数。我需要在编译时调用DoSomething。也许有人可以解释如何将boost::fusion::for_each
与static_assert()
一起使用?
答案 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!");