安全地通过宏传递模板参数逗号
Passing template argument commas through macros safely?
我目前使用宏来声明相对较长的部分专门化模板类列表,这样更简洁。下面是一些过于简单的例子:
#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
相关文章:
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 为表示一个或多个操作的C++函数的int参数寻找类型安全的替换
- 类型安全可变参数函数
- 编译器在 const ref 类型参数上使用临时对象时是否应该警告不安全的行为?
- 提供带有常量参数的函数指针作为带有非常量参数的函数指针是否安全?
- C++:传递像 unique_ptr:get() 这样的参数来函数是否安全?
- 使用安全模式从DLL(通过(INTPTR)参数传递到该函数)获取char **
- C 11-当我将局部变量作为参数传递到线程中时,它是否安全
- 如何要求接口中参数的线程安全
- 为什么我可以通过这样的字符串参数?这种样式安全吗?
- 与构造函数参数相关的异常安全的习语
- 键入安全字符串参数
- 在传递的对象即将被销毁之前,发出将QObject指针作为参数传递的信号是否安全
- Visual Studio 2015 错误 C4996"std::_Copy_impl":使用可能不安全的参数进行函数调用
- 如何干净地创建类型安全的枚举参数
- 使用可变参数模板创建传递新对象的更安全方式是否是个好主意
- 错误 C4996:"std::_Copy_impl":使用可能不安全的参数进行函数调用
- 在C++中丢弃模板参数安全吗
- c++函数参数安全
- 正在使用空weak_ptr作为参数安全调用map::count