gpt4 book ai didi

c++ - 通过宏安全地传递模板参数逗号?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:41:15 25 4
gpt4 key购买 nike

我目前正在使用宏来更简洁地声明相对较长的部分专用模板类列表。以下是一些过于简化的示例:

#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 pp 的众多解决方案之一

#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++ - 通过宏安全地传递模板参数逗号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8661960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com