Как явно создать экземпляр шаблона для всех членов Вектор MPL в C ++?

Рассмотрим следующий файл заголовка:

// Foo.h
class Foo {
    public: 
        template <typename T>
        void read(T& value);
};

Я хочу явно создать экземпляр шаблона функции-члена Foo :: read в исходном файле для все типы включены в boost :: mpl :: vector :

// 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 в конструкторе структуры, переменная которой тогда объявлено, вызвать создание экземпляра:

// 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.)

20
задан LThode 9 December 2014 в 14:36
поделиться