我试图在编译时从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);
但是它告诉我在这两种情况下都不存在这样的演员。
答案 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
具有编译时长度,任何元素都可以是任何元素
类型。