Могу ли я сохранить значение аргумента шаблона i для int2type & lt; i & gt ;?

У меня есть различные типы данных. Хотелось бы хранить их в векторе / дереве (например, в структуре данных каталога), но в какой-то момент мне нужно получить реальный тип и работать с реальным типом. например распечатайте их, выполнив boost :: fusion :: for_each для каждого члена класса. Я посмотрел на следующие варианты решений:

  1. Boost :: Вариант — есть ограничение в 50 типов. Я получил больше, как сотни, возможно, вырасту до тысячи.
  2. Виртуальное + наследование — я мог бы иметь другой интерфейсный класс, который построен на основе типа T, и хранить базовый класс интерфейса, который имеет виртуальные функции для работы с реальными типами. Но тогда я должен написать 1 виртуальную функцию для каждого действия. Это также становится грязным при двойной диспетчеризации.
  3. Читайте об идиоме Int2Type. Могу ли я сделать что-то подобное?

Я попытался следующее. Есть ли способы передать значение шаблона из последнего цикла? Не уверен, как хранить это. Это проблема куриного яйца.

#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 ) );
}
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]