首页 > 解决方案 > 循环一个 typedef 列表

问题描述

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

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

基本上我有这样的事情:

for(int i = 0; i < limit; i++)
{
  type object;
  object.do_stuff();
}

例如,在第一次迭代中,“type”将为 int,在第二次迭代中,“type”将为 double,依此类推。

我不能使用可变模板,因为我有 100 多个元素,据我所知,这对系统来说会非常繁重。

我的想法是创建一个“typedefs 向量”来循环所有类型的对象。

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

我不知道这是否可能。

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

标签: c++arraysmetaprogrammingtypedef

解决方案


我不能使用可变模板,因为我有 100 多个元素,据我所知,这对系统来说会非常繁重。

你所知道的要么是过时的,要么是不准确的。只需查看metaben.ch,就可以了解在最小编译时间影响的情况下类型列表可以得到多大。


我的想法是创建一个“typedefs 向量”来循环所有类型的对象。

那是一个类型列表。以下是您可以执行的操作:

// 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>{}), ...);
    }
};

C++17 用法:

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

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`
});

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


推荐阅读