c++ - 在 C++ 中增量构建编译时间列表

标签 c++ list templates template-meta-programming cons

在 C++ 中,有没有一种方法可以按照以下模式逐步构建编译时间列表?

START_LIST(List)
ADD_TO_LIST(List, int)
ADD_TO_LIST(List, float)
ADD_TO_LIST(List, double)
END_LIST(List)

这个结果应该等同于:

using List = Cons<int, Cons<float, Cons<double, Nil>>>;

我还有一个限制,即宏之间的空间需要在整个范围内。我打算使用宏定义事物并将它们同时注册到列表中,如下所示:

#define DEFINE_ELEMENT(Name, Value) \
using Name = SomeTemplate<Value>; \
ADD_TO_LIST(ListOfElements, Name)

换句话说,不允许定义START_LIST类似于 SomeTemplate<decltype( .这将使得无法在两者之间添加新的定义。

请注意,解决方案也可以采用“参数包”(可变参数模板)列表的形式。我只关心它是否遵循如上所示的增量定义模式。

这里可以使用特化吗?如果上述模式不完全可行,是否可以使用更多的样板文件?

最佳答案

您可以直接使用 C++11 可变参数模板,它们允许以比经典函数式 head:tail 方法更奇特的方式编写类型列表:

template<typename... Ts>
struct list{};

using l = list<int,char,bool>;

另一方面,如果您喜欢头尾方式,您可以从一种格式转换为另一种格式。在这种情况下(可变参数到函数):

template<typename HEAD , typename TAIL>
struct list{};

struct nil{};

template<typename... Ts>
struct make_list;

template<typename HEAD , typename... TAIL>
struct make_list<HEAD,TAIL>
{
    using result = list<HEAD,typename make_list<TAIL...>::result;
};

template<>
struct make_list<>
{
    using result = nil;
};

一个例子:

//l is list<int,list<char,list<bool,nil>>>
using l = typename make_list<int,char,bool>::result;

当然你可以使用模板别名来使语法更清晰:

template<typename... Ts>
using make = typename make_list<Ts...>::result;

using l = make<int,char,bool>;

关于c++ - 在 C++ 中增量构建编译时间列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24088373/

相关文章:

c++ - 重载 * 运算符仅适用于一个构造函数

c++ - 分析函数内存和 CPU 使用率

java - 不需要 Android JNI System.loadLibrary?

c++ - 如何在远程类之间共享数据?

c# - 使用 LINQ 关联两个列表之间的值?

C# 2.0 设计问题 - 从更大的列表创建子列表

c++ - 长 C++ 模板类型的 doxygen 换行符

c++ - 标识符 "do"未定义

c++ - 为什么 ostream iomanip 在传递给操作符 << 时不需要模板参数?

c++ - 如何用不同数量的默认参数包装一个函数,使其只有一个参数?