У меня есть различные типы данных. Хотелось бы хранить их в векторе / дереве (например, в структуре данных каталога), но в какой-то момент мне нужно получить реальный тип и работать с реальным типом. например распечатайте их, выполнив boost :: fusion :: for_each для каждого члена класса. Я посмотрел на следующие варианты решений:
Я попытался следующее. Есть ли способы передать значение шаблона из последнего цикла? Не уверен, как хранить это. Это проблема куриного яйца.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct NullType {};
struct A {};
struct B {};
template <int i=0>
struct Int2Class
{
typedef NullType Type;
};
template <> struct Int2Class<1>
{
typedef A Type;
};
template <> struct Int2Class<2>
{
typedef B Type;
};
struct Base
{
virtual ~Base() {}
};
template <typename T>
struct Data : public Base
{
Data() {}
Data( const T& t ) : t_( t ) {}
T t_;
};
template <typename T>
void ft( const T& t )
{
// do something specific to T
}
int main()
{
A a;
B b;
Base* d1 = new Data<A>( a );
Base* d2 = new Data<B>( b );
std::vector<Base*> v;
v.push_back( d1 );
v.push_back( d2 );
Data<A>* a1 = static_cast<Data<A>*>( d1 );
if( a1 ) cout << "yeah\n";
typedef Data<Int2Class<1>::Type>* Type;
Data<A> *a2 = static_cast<Type>( d1 );
if( a2 ) cout << "yeah2\n";
for( std::vector<Base*>::iterator i = v.begin(); i != v.end();
++i )
{
// for illustration purpose, items in vector is in the order
// of the class Id #, or save that as part of a pair in the
// vector
typedef Data<Int2Class<???>::Type>* Type;
ft( static_cast<Type>( *i ) );
}
}
Задача ещё не решена.
Других решений пока нет …