循环typedef列表

Dom*_*lli 1 c++ arrays typedef metaprogramming

如果标题有点误导,我很抱歉.

我有一个循环一些数据的函数.每次迭代时此数据的类型都会发生变化.

基本上我有这样的事情:

for(int i = 0; i < limit; i++)
{
  type object;
  object.do_stuff();
}
Run Code Online (Sandbox Code Playgroud)

这里例如在第一次迭代中"type"将是int,在第二次迭代时"type"将是double,等等.

我不能使用varyadic模板,因为我有超过100个元素,据我所知,它对系统非常重要.

我的想法是创建一个"typedef的向量"来循环所有类型的对象.

vector<????> type;
type.push_back(int);
type.push_back(double);
...
for(int i = 0; i < limit; i++)
{
  type[i] object;
  object.do_stuff();
}
Run Code Online (Sandbox Code Playgroud)

我不知道这是否可能.

我看到了类型列表的基础知识,但我不知道是否可以重现循环.

Vit*_*meo 7

我不能使用varyadic模板,因为我有超过100个元素,据我所知,它对系统非常重要.

您所知道的是过时的或不准确的.只需查看metaben.ch,即可了解大型列表可以获得的最小编译时间.


我的想法是创建一个"typedef的向量"来循环所有类型的对象.

这是一个类型列表.这是你可以做的:

// Store the type in a value for convenience
template <typename T>
struct type_wrapper
{
    using type = T;
};

template <typename... Ts>
struct typelist
{
    template <typename F>
    constexpr void for_each(F&& f)
    {
        // C++17 fold expression over comma operator
        (f(type_wrapper<Ts>{}), ...);
    }
};
Run Code Online (Sandbox Code Playgroud)

C++ 17用法:

typelist<int, float, char>{}.for_each([](auto t)
{
    using type = typename decltype(t)::type;
    // Use `type`
});
Run Code Online (Sandbox Code Playgroud)

C++ 20用法(稍作修改typelist):

template <typename... Ts>
struct typelist
{
    template <typename F>
    constexpr void for_each(F&& f)
    {
        // C++17 fold expression over comma operator
        (f.template operator()<Ts>(), ...);
    }
};

typelist<int, float, char>{}.for_each([]<typename T>()
{
    // Use `T`
});
Run Code Online (Sandbox Code Playgroud)

我写了一篇与此主题相关的简短文章:"使用C++ 20 lambdas进行编译时迭代".