考虑以下头文件:
// 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;
但我不知道这个解决方案是否可移植,是否符合标准?(与英特尔和GNU编译器配合使用。)
发布于 2016-12-31 22:40:06
不久前我也有过同样的需求,并且用一个简单的函数模板实例化就得到了很好的结果:
template <class... T>
void forceInstantiation(typedef boost::mpl::vector<T...>*) {
using ex = int[];
(void)ex{(void(&Foo::read<T>), 0)..., 0};
// C++17
// (void)((void(&Foo::read<T>), ...));
}
template void forceInstantiation(types*);
发布于 2011-04-19 19:37:02
我不确定这是否是您的问题的解决方案,但也许您可以使用模板专门化。
新标题:
// Foo.h
template < typename T >
struct RealRead;
class Foo {
public:
template <typename T>
void read(T& value);
};
template <typename T>
void Foo::read(T& value)
{
RealRead< T >::read( value );
}
新的来源:
template < >
struct RealRead< int >
{
static void read( int & v )
{
// do read
}
};
template < >
struct RealRead< float >
{
static void read( float & v )
{
// do read
}
};
//etc
// explicitly instantiate templates
template struct RealRead< int >;
template struct RealRead< float >;
发布于 2011-07-01 23:38:53
您可以使用template class Foo<T>;
显式地实例化给定T模板参数的Foo
至于批量实例化,我认为这是不可能的。也许使用可变模板可以创建一个实例化类,这样像Instantiate<Foo, int, short, long, float, etc>
这样的东西就可以实例化适当的模板,但除此之外,您必须求助于手动实例化。
https://stackoverflow.com/questions/5715586
复制相似问题