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)
我不知道这是否可能.
我看到了类型列表的基础知识,但我不知道是否可以重现循环.
我不能使用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进行编译时迭代".
| 归档时间: |
|
| 查看次数: |
152 次 |
| 最近记录: |