安全地通过宏传递模板参数逗号

Passing template argument commas through macros safely?

本文关键字:参数 安全      更新时间:2023-10-16

我目前使用宏来声明相对较长的部分专门化模板类列表,这样更简洁。下面是一些过于简单的例子:

#define INSTANTIATE_MYTYPE(freeargs, specialization, myvalue) 
template <freeargs> 
struct MyType <specialization> {
  static const bool value = myvalue;
}

如果我没有在每个大小写中传递逗号,这就可以正常工作:

INSTANTIATE_MYTYPE(typename T, std::vector<T>, true);

有一个可以容忍的解决方法如果我用逗号穿过单个级别的宏展开:

#define MacroComma ,
INSTANTIATE_MYTYPE(typename S MacroComma typename T,
                   std::pair<S MacroComma T>, true);

但是如果我尝试添加一个额外的宏层,它会失败:

#define INSTANTIATE_ALL(freeargs, specialization, myvalue) 
INSTANTIATE_MYTYPE(freeargs, specialization, myvalue); 
INSTANTIATE_ANOTHERTYPE(freeargs, specialization, myvalue); 
INSTANTIATE_ATHIRDTYPE(freeargs, specialization, myvalue)
// etcetera
INSTANTIATE_ALL(typename S MacroComma typename T,
                std::pair<S MacroComma T>, true);

尝试添加额外的宏间接级别(通过#define MacroComma2 MacroComma或各种其他尝试)一直失败。当替换在模板参数列表中进行时,额外的括号不起作用。似乎有一个技巧与可变宏可能工作,但我试图保持c++ 2003标准兼容。是否有可能在c++ 2003中以某种方式在宏内乘以"转义"逗号?

或者,有没有一种简洁的方法来声明部分专门化的长列表而不使用宏?我的Google-fu没有找到任何相关的东西,但似乎应该有某种类型列表元编程技巧。

使用boost的众多解决方案之一

#define INSTANTIATE_MYTYPE(DATA)                          
template <BOOST_PP_SEQ_ELEM(0,DATA)>                      
struct MyType <BOOST_PP_SEQ_ELEM(1,DATA)> {               
    static const bool value = BOOST_PP_SEQ_ELEM(2,DATA);  
}
INSTANTIATE_MYTYPE((typename T, ...)
                   (std::vector<T>, ....)
                   (true));

进一步阅读:http://www.boostpro.com/mplbook/preprocessor.html