considere el siguiente archivo de cabecera:¿Cómo crear una instancia explícita de una plantilla para todos los miembros del vector MPL en C++?
// Foo.h
class Foo {
public:
template <typename T>
void read(T& value);
};
Quiero crear una instancia explícitamente la plantilla de función Foo::read
miembro en un archivo de origen para todos los tipos incluidos en un 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 ???
¿Es posible? Gracias de antemano, Daniel.
EDITAR
he encontrado alguna solución - parece que la asignación de un puntero a Foo::read<T>
en el constructor de una estructura, de los cuales variable se declara a continuación, la causa de instancias:
// 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;
Entonces el proceso puede automatizarse de la siguiente manera:
// 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;
Pero no sé si Thi ¿La solución es portátil y cumple con los estándares? (Funciona con compiladores de Intel y GNU).
nitpick: la pregunta podría ser un poco más claro si su clase 'foo' realidad cabeza un miembro de' 'read' en Foo.h' – Mat
@nitpick: editado, por mi culpa, gracias –
corto de usar preprocesador soluciones basadas, no creo que sea posible. –