Посоветуйте плз. решение. Хочу иметь переменную класса 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;
}
Re: Variant по mpl types sequences как член класса - как сделать?
Здравствуйте, Warturtle, Вы писали:
W>Здравствуйте, LowCoder, Вы писали:
W>Пример не компилирвется по другим причинам, но один variant кажется лишним (см. выделенное ниже) LC>>...
LC>>
LC>>...
LC>>typedef mpl::vector< worker1, worker2> workers;
LC>> static std::vector< types > m_t;// По кр мере должно быть как-то так
LC>>};
LC>>template<typename K> std::vector< boost::variant<K> > process<K>::m_t;
LC>>...
LC>>
Так к сожалению не работает — я пробовал. m_t3 это просто опечатка — в коде все ок. Variadic мне к сожалению не подходит — требование проекта.
Re[3]: Variant по mpl types sequences как член класса - как сделать?
Здравствуйте, LowCoder, Вы писали:
LC>Здравствуйте, Warturtle, Вы писали:
W>>Здравствуйте, LowCoder, Вы писали:
W>>Пример не компилирвется по другим причинам, но один variant кажется лишним (см. выделенное ниже) LC>>>...
LC>>>
LC>>>...
LC>>>typedef mpl::vector< worker1, worker2> workers;
LC>>> static std::vector< types > m_t;// По кр мере должно быть как-то так
LC>>>};
LC>>>template<typename K> std::vector< boost::variant<K> > process<K>::m_t;
LC>>>...
LC>>>
LC>Так к сожалению не работает — я пробовал. m_t3 это просто опечатка — в коде все ок. Variadic мне к сожалению не подходит — требование проекта.
Я очень извиняюсь но код был не совсем корректный. Дело в том что на каждый вызов функций init, run, stop создаются все новые объекты worker1 worker2 те внутренняя переменная m_t3 не вызывается. А вот и правильное окончательное и бесповоротное решение:
Тут можно убрать дублирование, вынеся общую часть в отдельное место.
LC>Вывод чудо-проги
Если нужна скорость, и не важен порядок элементов в векторе, то вместо вектора вариантов можно использовать отдельный вектор на каждый тип. Это убирает dynanic-dispatch при заходе в каждый элемент, плюс более плотная упаковка данных.
Автоматизируется это следующим образом:
Здравствуйте, LowCoder, Вы писали:
LC>Симпатично.. но я к сожалению ограничен предыдущим стандартом.
Это механически переписывается на C++98. Полиморфная лямбда просто заменяется классом с шаблонным operator(), а variadic template parameters на mpl sequence.
Причём изначально я делал пример именно для C++98
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, LowCoder, Вы писали:
LC>>Симпатично.. но я к сожалению ограничен предыдущим стандартом.
EP>Это механически переписывается на C++98. Полиморфная лямбда просто заменяется классом с шаблонным operator(), а variadic template parameters на mpl sequence. EP>Причём изначально я делал пример именно для C++98