从 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
有编译时长度,任意元素可以任意
类型。
我正在尝试在编译时从 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
有编译时长度,任意元素可以任意
类型。