从 Boost Hana 元组转换为标准向量

Convert from Boost Hana Tuple to Std Vector

我正在尝试在编译时从 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 中实现这种效果? IE。什么样的编译时 Hana 构造允许我们执行此转换?我试过

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

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

但它告诉我在这两种情况下都不存在这样的转换。

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

其次,从 hana::tuple 初始化 std::vector 真的没有意义,因为这意味着元组的所有元素都具有相同的类型。相反,您可能应该使用 std::array。当您需要异质性(具有不同类型的元素)时, Hana 很有用,而您在这里似乎不需要。当你不需要异构性时,使用 std::array 或类似的工具将比使用 Hana 更容易和自然。

除了 Louis 解决的问题之外,还有一些与您尝试使用元组的方式有关的其他问题。请注意,元组的长度或其中的类型不能更改,因为类型在 C++ 中是完全不可变的,因此您必须从纯函数式编程的角度考虑。

您对 is_empty 的调用将始终 return 为真,并且 drop_front 无法更改输入值,它只是 return 一个删除了前面元素的新元组. (在您的情况下,它将是 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有编译时长度,任意元素可以任意
    类型。