首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在C++中显式实例化MPL向量的所有成员的模板?

如何在C++中显式实例化MPL向量的所有成员的模板?
EN

Stack Overflow用户
提问于 2011-04-19 19:24:52
回答 6查看 2.4K关注 0票数 20

考虑以下头文件:

代码语言:javascript
复制
// Foo.h
class Foo {
    public: 
        template <typename T>
        void read(T& value);
};

我希望在源文件中为boost::mpl::vector中包含的所有类型显式实例化Foo::read成员函数模板

代码语言:javascript
复制
// 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>的指针,然后声明该结构的变量,导致实例化:

代码语言:javascript
复制
// 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;

因此,该过程可以自动化,如下所示:

代码语言:javascript
复制
// 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编译器配合使用。)

EN

回答 6

Stack Overflow用户

发布于 2016-12-31 22:40:06

不久前我也有过同样的需求,并且用一个简单的函数模板实例化就得到了很好的结果:

代码语言:javascript
复制
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*);
票数 1
EN

Stack Overflow用户

发布于 2011-04-19 19:37:02

我不确定这是否是您的问题的解决方案,但也许您可以使用模板专门化。

新标题:

代码语言:javascript
复制
// 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 );
}

新的来源:

代码语言:javascript
复制
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 >;
票数 0
EN

Stack Overflow用户

发布于 2011-07-01 23:38:53

您可以使用template class Foo<T>;显式地实例化给定T模板参数的Foo

至于批量实例化,我认为这是不可能的。也许使用可变模板可以创建一个实例化类,这样像Instantiate<Foo, int, short, long, float, etc>这样的东西就可以实例化适当的模板,但除此之外,您必须求助于手动实例化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5715586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档