c++ - 循环一个 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();
}
我不知道这是否可能。
我看到了类型列表的基础知识,但我不知道是否可以重现循环。
解决方案
我不能使用可变模板,因为我有 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 进行编译时迭代”。
推荐阅读
- angular - 无法访问应用 Angular + nginx + istio
- notepad++ - 腻子日志包含 ESC BEL
- javascript - 页面加载后使用 Resume 功能秒表
- flutter - Flutter :- 如何像在 Android“SingleTask”中一样管理后台堆栈?
- javascript - 子文件夹中的 Vue CLI 3 SPA,根目录中的静态 HTML 页面
- design-patterns - Twilio Chat 与房产列表网站集成
- c - Gets/fgets 跳过 C 中的输入步骤
- file - 如何创建自定义的 ubuntu 服务器 18.04 LTS ISO 文件?
- jenkins - 即使 jmeter 持续时间断言失败,Jenkins 构建也会通过
- java - 是否可以使用java方法返回“如果条件满足返回列表,否则返回错误消息”