boost :: any и шаблоны

Я пишу библиотеку, которая включает в себя множество хитростей как шаблона, так и boost :: any. Я столкнулся с ситуацией, когда у меня по сути есть это:

boost::any a1, a2, a3, a4;

… и мне нужно вызвать функцию, которая выглядит следующим образом:

template <typename A1, typename A2, typename A3, typename A4>
void somefunc (A1 a1, A2 a2, A3 a3, A4 a4);

Я мог бы прибегнуть к непристойно вложенной серии операторов if, но при условии, что я обрабатываю 10 различных типов, это 10000 операторов if! Boost препроцессор может помочь здесь, но это все еще ужасное решение.

Есть ли лучший способ вызвать шаблонную функцию с содержимым boost :: any, не прибегая к такого рода безумию? Насколько я могу сказать, нет.

5

Решение

Если все ваши any объекты могут быть установлены одновременно, вы можете просто жестко кодировать тип для указателя на функцию тут же. Наполните все это отдельным предметом, и все готово. Это в основном двойной дубль типа стирания, и может также быть реализован с помощью виртуальных функций (например, как boost::any работает внутри), но мне больше нравится эта версия:

// note that this can easily be adapted to boost::tuple and variadic templates
struct any_container{
template<class T1, class T3, class T3>
any_container(T1 const& a1, T2 const& a2, T3 const& a3)
: _ichi(a1), _ni(a2), _san(a3), _somefunc(&somefunc<T1, T2, T3>) {}

void call(){ _somefunc(_ichi, _ni, _san); }

private:
boost::any _ichi, _ni, _san;
// adjust to your need
typedef void (*func_type)(boost::any&, boost::any&, boost::any&);
func_type _somefunc;

template<class T1, class T2, class T3>
void somefunc(boost::any& a1, boost::any& a2, boost::any& a3){
// access any objects with 'boost::any_cast<TN>(aN)'
}
};
10

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector