Как создать вектор кортежей в C ++? - PullRequest
1 голос
/ 08 января 2020

Есть генератор, который генерирует кортеж из 16 целых чисел с каждой итерацией. Я хочу добавить эти кортежи в вектор. При создании вектора я должен написать std::vector<std::tuple<int, int, .... 16 times>>. Есть ли другой способ создать вектор из этих кортежей.

Код для проверки на случай кортежей, содержащих 5 целых чисел:

#include "cppitertools/itertools.hpp"
#include <iostream> 
#include <tuple>
#include <vector> 

int main()
{
    std::vector<int> v1{0, 1};
    std::vector<std::tuple<int, int, int, int, int>> states;

    for (auto&& i : iter::product<5>(v1)) 
    {
        states.push_back(i);
    }

    auto size = states.size();
    std::cout << size << std::endl;

}

Я использую cppiterator

Ответы [ 2 ]

3 голосов
/ 08 января 2020
template<size_t Remaining, typename Type,typename ... Args>
struct make_tuple_n_impl{
    using type=typename make_tuple_n_impl<Remaining-1,Type,Type,Args...>::type;
};

template<typename T,typename ... Args>
struct make_tuple_n_impl<0,T,Args...>{
    using type=std::tuple<Args...>;
};

template<size_t Count,typename Type>
using tuple_of=typename make_tuple_n_impl<Count,Type>::type;

Тогда tuple_of<5,int> равно std::tuple<int,int,int,int,int>.

0 голосов
/ 08 января 2020

Вы можете просто изменить тип кортежа, который iter::product создает

#include "cppitertools/itertools.hpp"
#include <iostream> 
#include <tuple>
#include <vector> 

template <typename>
struct remove_tuple_reference;

template <typename... Ts>
struct remove_tuple_reference<std::tuple<Ts...>> {
    using type = std::tuple<std::remove_reference_t<Ts>...>;
};

template <typename T>
using remove_tuple_reference_t = typename remove_tuple_reference<T>::type;

int main()
{
    std::vector<int> v1{0, 1};
    using tup = remove_tuple_reference_t<decltype(iter::product<5>(v1).begin())::value_type>;
    std::vector<tup> states;

    for (auto&& i : iter::product<5>(v1)) 
    {
        states.push_back(i);
    }

    auto size = states.size();
    std::cout << size << std::endl;

}
...