带有 boost 的模板实例化:传递额外的参数

Posted

技术标签:

【中文标题】带有 boost 的模板实例化:传递额外的参数【英文标题】:template instantiation with boost: pass extra arguments 【发布时间】:2017-05-19 16:50:31 【问题描述】:

说我有表单的实例

template void MyClass<2,typeA>::some_method() const;

用于模板参数的各种组合。

我正在尝试定义一个带有 boost 的宏,它需要一个前缀 (void) 和一个后缀 some_method() const,以便我可以将它重用于显式实例化。

使用硬编码的返回类型和函数名称,可以按照以下方式完成(尚未测试过):

#define DIM (2)(3)
#define DEG (typeA)(typeB)
#define INSTANTIATEONE(_, targs) void MyClass<BOOST_PP_SEQ_ENUM(targs)>::some_method() const;
#define INSTANTIATEALL() BOOST_PP_SEQ_FOR_EACH_PRODUCT(INSTANTIATEONE, (DIM)(DEG));

有没有办法扩展宏以将voidsome_method() const 作为参数?我是增强预处理器的新手,不知道该怎么做。

【问题讨论】:

【参考方案1】:

我最终使用了

# include <boost/preprocessor/facilities/empty.hpp>
# include <boost/preprocessor/list/at.hpp>
# include <boost/preprocessor/list/for_each_product.hpp>
# include <boost/preprocessor/tuple/elem.hpp>
# include <boost/preprocessor/tuple/to_list.hpp>

#define DIM BOOST_PP_TUPLE_TO_LIST(2,(2,3))
#define DEG BOOST_PP_TUPLE_TO_LIST(1,(typeA))

#define INSTANTIATE(R, L) \
    template void MyClass<BOOST_PP_TUPLE_ELEM(2, 0, L), \
                          BOOST_PP_TUPLE_ELEM(2, 1, L)>::some_method() const;                            
BOOST_PP_LIST_FOR_EACH_PRODUCT(INSTANTIATE, 2, (DIM, DEG))

【讨论】:

以上是关于带有 boost 的模板实例化:传递额外的参数的主要内容,如果未能解决你的问题,请参考以下文章

带有非类型参数的奇怪模板实例化错误

使用Armadillo和boost :: numeric :: odeint进行模板实例化

可变参数模板错误:“在实例化中”(gcc 9.2)

显式实例化模板类的显式实例化模板方法

将模板类型传递给宏[重复]

正确使用函数的显式模板实例化?