在 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/