如何在C ++中为MPL向量的所有成员显式实例化模板?
|
考虑以下头文件:
// Foo.h
class Foo {
public:
template <typename T>
void read(T& value);
};
我想在源文件中为boost::mpl::vector
中包括的所有类型显式实例化Foo::read
成员函数模板:
// Foo.cc
#include <boost/mpl/vector.hpp>
#include <boost/mpl/begin_end.hpp>
#include \"Foo.h\"
template <typename T>
void Foo::read(T& value) { /* do something */ }
typedef boost::mpl::vector<int, long, float> types;
// template Foo::read<int >(int&);
// template Foo::read<long >(long&);
// template Foo::read<float>(float&);
// instantiate automatically ???
可能吗?预先感谢,丹尼尔。
编辑
我找到了一些解决方案-似乎在结构的构造函数中向Foo::read<T>
分配了一个指针,然后声明了该变量的变量,导致实例化:
// intermezzo
template <typename T> struct Bar {
Bar<T>() {
void (Foo::*funPtr)(T&) = &Foo::read<T>;
}
};
static Bar<int > bar1;
static Bar<long > bar2;
static Bar<float> bar3;
因此,该过程可以如下自动化:
// Foo.cc continued
template <typename B, typename E>
struct my_for_each {
my_for_each<B, E>() {
typedef typename B::type T; // vector member
typedef void (Foo::*FunPtr)(T&); // pointer to Foo member function
FunPtr funPtr = &Foo::read<T>; // cause instantiation?
}
my_for_each<typename boost::mpl::next<B>::type, E> next;
};
template<typename E>
struct my_for_each<E, E> {};
static my_for_each< boost::mpl::begin<types>::type,
boost::mpl::end<types>::type > first;
但是我不知道此解决方案是否可移植且符合标准? (适用于Intel和GNU编译器。)
没有找到相关结果
已邀请:
6 个回复
屡倒雷图
疏腔傻小雹
新来源:
佃蒜狗掂哥
显式实例化给定T模板参数的Foo。 至于批处理实例化,我认为这是不可能的。也许使用可变参数模板可以创建一个实例化类,以便像ѭ11这样的实例可以实例化适当的模板,但是除此之外,您必须求助于手动实例化。
淘圃跺枯替
埃输林桨铃
当T是cin支持的流类型时,T定义明确。 如果删除\“ Foo :: \”,该示例将是独立的。我的意思是,对于\“ Foo :: \”,您应该在某个地方定义一个类Foo或命名空间Foo,以使其起作用。 但是请注意,模板应始终放在.h文件中,而不是.cpp文件中(只需在网络上搜索关键字“ c ++模板不能在cpp文件中实现”
扭湘阀柿蹄
如果您需要导出/导入您的结构和模板方法,则可以使用boost / preprocessor解决方案
如果您不需要此额外功能,我想第一种解决方案会更清洁