Конвертировать из Boost Hana Tuple в Std Vector - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь создать std :: vector из boost :: hana :: tuple во время компиляции следующим образом:

boost::hana::tuple<std::string> namesString{ "Hello", "World" };
std::vector<std::string> namesStringVector{};
while(!(hana::is_empty(namesString)))
{ 
    namesStringVector.emplace_back(hana::front(namesString));
    hana::drop_front(namesString);
}

Это явно не работает, потому что цикл while не работаетзапустить во время компиляции.

Как нам добиться этого эффекта в Boost :: Hana?Т.е. какая конструкция Hana времени компиляции позволила бы нам выполнить это приведение?Я пытался сделать

    namesStringVector = (std::vector<std::string>)namesString;

и hana::to < std::vector < std::string > >(namesString);

Но он говорит мне, что в обоих случаях такого приведения не существует.

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

В дополнение к проблемам, которые решал Луи, есть и другие проблемы с тем, как вы пытаетесь использовать кортеж.Обратите внимание, что кортеж не может иметь свою длину или типы внутри него изменены, так как типы полностью неизменны в C ++, поэтому вы должны думать с точки зрения чисто функционального программирования.

Ваш вызов is_empty всегда будет возвращать trueи drop_front не может изменить входное значение, оно возвращает только новый кортеж с удаленным передним элементом.(в вашем случае это будет tuple<>, что пусто).

Возможно, вы захотите переосмыслить свой сценарий использования для преобразования кортежа в вектор, но вот пример, который, надеюсь, поможет вам начать.

#include <boost/hana.hpp>
#include <iostream>
#include <string>
#include <vector>

namespace hana = boost::hana;


template <typename T>
constexpr auto to_vector = [](auto&& ...x) {
        return std::vector<T>{std::forward<decltype(x)>(x)...};
};

int main() {
        auto xs = hana::make_tuple("Hello", "World");

        auto vec = hana::unpack(xs, to_vector<std::string>);

        for (auto const& x : vec) {
                std::cout << x << ' ';
        }

        std::cout << '\n';
}

Примечания о типах списка:

  • std::vector имеет длительность выполнения и один тип для всех элементов.
  • std::array имеетдлина времени компиляции и один тип для всех элементов.
  • hana::tuple имеет длину времени компиляции, и любой элемент может быть любого типа
    .
0 голосов
/ 26 мая 2018

Для начала, boost::hana::tuple<std::string> namesString{ "Hello", "World" }; не имеет смысла, потому что ваш кортеж имеет только один элемент, но вы пытаетесь инициализировать его двумя.

Во-вторых, на самом деле не имеет смысла инициализировать std::vector из hana::tuple, поскольку это означает, что все элементы кортежа имеют одинаковый тип.Вместо этого вы, вероятно, должны использовать std::array.Хана полезна, когда вам нужна неоднородность (элементы разных типов), которая вам здесь не нужна.Когда вам не нужна неоднородность, использование std::array или аналогичных инструментов будет намного проще и естественнее, чем использование Hana.

...