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_each与static_assert()?
是否可以使用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)