Застряв в земле TR1, для тестовой программы мне нужно выполнить определенные операции с рядом объектов определенных типов. У меня есть пара определений типа кортежа, которые выглядят так:
typedef std::tr1::tuple< bool
, signed char
, signed short
, signed int
, signed long long
, unsigned char
, unsigned short
, unsigned int
, unsigned long long > integral_types;
Из каждого типа кортежа должен быть создан объект. У меня тогда есть шаблоны функций, подобные этому:
template<typename T>
void invoke_operation_1(T& obj);
Они должны быть вызваны для всех объектов в объекте кортежа.
Как мне это сделать в C ++ 03?
Вы могли бы использовать повышение :: фьюжн если вам нужно вызывать одну и ту же шаблонную функцию для каждого объекта в кортеже. Например.
template<typename T>
void invoke_operation_1(T& obj)
{
std::cout << obj << std::endl;
}
struct executor
{
template<typename T>
void operator()(T& t) const
{
invoke_operation_1(t);
}
};
typedef boost::tuple< bool
, signed char
, signed short
, signed int
, signed long long
, unsigned char
, unsigned short
, unsigned int
, unsigned long long > integral_types;
int main()
{
integral_types t(true, 0, 1, 2, 3, 4, 5, 6, 7);
boost::fusion::for_each(t, executor());
return 0;
}
В Бристоле для C ++ 14 была только что доработана функция, решающая эту проблему. Это не так уж и сложно.
В более простом случае вы можете использовать рекурсивный шаблон. Это немного путаница, хотя без частичной специализации функций и тому подобное.
template<typename Tup, std::size_t N> struct visit_detail {
template<typename F> static void call(Tup& t, F f) {
f(std::tr1::get<N>(t));
return visit_detail<Tup, N+1>::call(t, f);
}
};
template<typename Tup> struct visit_detail<Tup, std::tr1::tuple_size<Tup>::value> {
template<typename F> static void call(Tup& t, F f) {}
}
template<typename Tup, typename F> void visit(Tup& t, F f) {
return visit_detail<Tup, 0>::call(t, f);
}
Здесь f может быть жестко закодированным или параметрическим объектом-функцией или чем угодно.
template<typename tup, typename N>
struct visit_detailImpl {
template<typename f>
static void call(tup& t, f f) {
f(std::tr1::get<N::value>(t));
return visit_detailImpl<tup, std::integral_constant<std::size_t, N::value + 1> >::call(t, f);
}
};
template<typename tup> // end recursion struct
struct visit_detailImpl<tup, std::integral_constant<std::size_t, std::tr1::tuple_size<tup>::value> > {
template<typename f>
static void call(tup& t, f f) {}
};
template<typename tup, typename Fn>
void for_each_tup(tup& t, Fn f) {
return visit_detailImpl<tup, std::integral_constant<std::size_t, 0> >::call(t, f);
}