c++ 在运行时循环可变模板类型

iezvtpos  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(175)

我将一个代码从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表达式的东西?

iqjalb3h

iqjalb3h1#

std::vector可以用一个值列表来初始化,所以你可以直接在 braced-init-list 中展开包,比如:

template <typename... Ts>
std::vector<std::size_t> store_types()
{
    return { typeid(Ts).hash_code()... };
}

如果你想避免动态分配,你可以切换到使用std::array,比如:

// C++11 or 14
template <typename... Ts>
auto store_types() -> std::array<std::size_t, sizeof...(Ts)>
{
    return { typeid(Ts).hash_code()... };
}

// or
// C++17
template <typename... Ts>
auto store_types()
{
    return std::array{ typeid(Ts).hash_code()... };
}

相关问题