Я не использовал Fubu Mvc, но просто посмотрел на него. Это не закончено, но я мог бы использовать его при неравнодушной перезаписи существующего невеб-проекта winforms. Asp. Сетевой Mvc для веб-проектов только.
Boost.Fusion - это возможность:
Непроверенный пример:
struct DoSomething
{
template<typename T>
void operator()(T& t) const
{
t.do_sth();
}
};
tuple<....> t = ...;
boost::fusion::for_each(t, DoSomething());
Вам необходимо использовать метапрограммирование шаблона, здесь показано с помощью Boost.Tuple:
#include <boost/tuple/tuple.hpp>
#include <iostream>
template <typename T_Tuple, size_t size>
struct print_tuple_helper {
static std::ostream & print( std::ostream & s, const T_Tuple & t ) {
return print_tuple_helper<T_Tuple,size-1>::print( s, t ) << boost::get<size-1>( t );
}
};
template <typename T_Tuple>
struct print_tuple_helper<T_Tuple,0> {
static std::ostream & print( std::ostream & s, const T_Tuple & ) {
return s;
}
};
template <typename T_Tuple>
std::ostream & print_tuple( std::ostream & s, const T_Tuple & t ) {
return print_tuple_helper<T_Tuple,boost::tuples::length<T_Tuple>::value>::print( s, t );
}
int main() {
const boost::tuple<int,char,float,char,double> t( 0, ' ', 2.5f, '\n', 3.1416 );
print_tuple( std::cout, t );
return 0;
}
В C ++ 0x вы можете написать print_tuple ()
как функцию вариативного шаблона. вместо этого.
кортеж boost предоставляет вспомогательные функции get_head()
и get_tail()
, поэтому ваши вспомогательные функции могут выглядеть следующим образом:
inline void call_do_sth(const null_type&) {};
template <class H, class T>
inline void call_do_sth(cons<H, T>& x) { x.get_head().do_sth(); call_do_sth(x.get_tail()); }
как описано здесь http:// www.boost.org/doc/libs/1_34_0/libs/tuple/doc/tuple_advanced_interface.html
с std::tuple
должно быть похоже.
На самом деле, к сожалению, std::tuple
не предоставляет такой интерфейс, поэтому методы, предложенные ранее, должны работать, или вам нужно переключиться на boost::tuple
, который имеет другие преимущества (например, уже предоставленные операторы ввода-вывода). Хотя у boost::tuple
с gcc есть недостаток — он еще не принимает вариативные шаблоны, но это может быть уже исправлено, поскольку на моей машине не установлена последняя версия boost.