Как может Вы выполнять итерации по элементам станд.:: кортеж?

Я не использовал Fubu Mvc, но просто посмотрел на него. Это не закончено, но я мог бы использовать его при неравнодушной перезаписи существующего невеб-проекта winforms. Asp. Сетевой Mvc для веб-проектов только.

91
задан einpoklum - reinstate Monica 8 February 2019 в 20:00
поделиться

3 ответа

Boost.Fusion - это возможность:

Непроверенный пример:

struct DoSomething
{
    template<typename T>
    void operator()(T& t) const
    {
        t.do_sth();
    }
};

tuple<....> t = ...;
boost::fusion::for_each(t, DoSomething());
24
ответ дан 24 November 2019 в 06:40
поделиться

Вам необходимо использовать метапрограммирование шаблона, здесь показано с помощью 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 () как функцию вариативного шаблона. вместо этого.

9
ответ дан 24 November 2019 в 06:40
поделиться

кортеж 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.

1
ответ дан 24 November 2019 в 06:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: