我将一个代码从C11迁移到C17。在该代码中,我做了类似于以下(无效)代码的事情:
template <typename... Ts>
std::vector<std::size_t> store_types()
{
std::vector<std::size_t> t;
for(typename T : Ts)
t.push_back(typeid(T).hash_code());
return t;
}
目前,我的实现如下:
template <typename Unused>
void add_types_in(std::vector<std::size_t>&)
{}
template <typename Unused, typename First, typename... Others>
void add_types_in(std::vector<std::size_t>& t)
{
t.push_back(typeid(First).hash_code());
add_types_in<Unused, Others...>(t);
}
template <typename... Ts>
std::vector<std::size_t> store_types()
{
std::vector<std::size_t> t;
add_types_in<void*, Ts...>(t);
return t;
}
我在C17中看到了很多variadic函数,但还有很多东西我还不明白。**C17中是否有比我的实现更优雅的**(也就是更多的“一行”)**?**可能是类似于fold表达式的东西?
1条答案
按热度按时间iqjalb3h1#
std::vector
可以用一个值列表来初始化,所以你可以直接在 braced-init-list 中展开包,比如:如果你想避免动态分配,你可以切换到使用
std::array
,比如: