从Boost Hana Tuple转换为Std Vector

时间:2018-05-25 19:44:40

标签: c++ boost boost-hana

我试图在编译时从boost :: hana :: tuple创建一个std :: vector,如下所示:

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 :(得分:2)

对于初学者来说,boost::hana::tuple<std::string> namesString{ "Hello", "World" };没有意义,因为你的元组只有一个元素,但是你尝试用两个元素初始化它。

其次,从std::vector初始化hana::tuple没有意义,因为它暗示元组的所有元素都具有相同的类型。相反,您应该使用std::array。当您需要异质性(具有不同类型的元素)时,Hana非常有用,您现在不需要这些异质性。当您不需要异质性时,使用std::array或类似工具将比使用Hana更容易和自然。

答案 1 :(得分:1)

除了路易斯所关注的问题之外,还有其他一些与你如何使用元组有关的问题。请注意,元组不能有其长度或其中的类型已更改,因为类型在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具有编译时长度,任何元素都可以是任何元素 类型。