Variant по mpl types sequences как член класса - как сделать?
От: LowCoder  
Дата: 03.02.14 12:16
Оценка:
Привет всем!

Посоветуйте плз. решение. Хочу иметь переменную класса variant по заранее определенной последовательности типов. А затем в main вызвать метод, который вызывает метод каждого объекта, который имеет тип определенный в последовательности типов .

Сейчас поясню.


struct worker1
{
   void init()
   {
      std::cout << "Worker1 init called" << std::endl;
   }
};

struct worker2
{
   void init()
   {
      std::cout << "Worker2 init called" << std::endl;
   }
};

typedef mpl::vector< worker1, worker2> workers;

template< typename U> struct process3
{
   process3()
   {
      factory();
   }

   struct factoryrun
   {
      template< typename T > void operator()(T& x)
      {
         std::cout << "Factory entry" << std::endl;
         std::cout << "Type is = " << typeid( T ).name() << std::endl;

         m_t3.push_back( x ); // FAIL!!! :(( Doesn't work
      }
   };

   struct runinit
   {
      template<typename T> void operator()(T& x)
      {
         x.init();
      }
   };

   void init()
   {
      mpl::for_each<U>( runinit() );
   }

   void factory()
   {
      std::cout << "Factory start" << std::endl;
      mpl::for_each<U>( factoryrun() );
   }

   typedef typename boost::make_variant_over< U >::type types; // FAIL!!! Doesn't work because I need to have variant<worker1, worker2> but not variant<workers>
   static std::vector< boost::variant<types> > m_t;
};

template<typename K> std::vector< boost::variant<K> > process<K>::m_t;

int main() {
   process<workers> prs;
   // Here should be called init() for worker1 and worker2   
   prs.init();
   return 0;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.