hana :: tuple to auto&& ... args

时间:2017-04-22 16:03:38

标签: c++ c++14 metaprogramming boost-hana

有没有办法使用类似的东西:

constexpr auto foo = hana::make_tuple(hana::type_c<Foo1>,hana::type_c<Foo2>);

有类似的东西:

template < typename ... Ts >
struct Final {

  constexpr Final(Ts && ... args) {}
};

hana::unpack(foo, [] (auto && ... args) { return Final(args...); });

因为使用该代码,unpack无法推断lambda / function类型。 基本上我想创建一个带有参数列表的类型,但我有一个包含参数的元组。

2 个答案:

答案 0 :(得分:4)

问题在于你的lambda:

[](auto && ... args){ return Final(args...); }
//                          ~~~~~~~

Final不是一种类型,它是一个类模板。因此,您需要明确提供类型。类似的东西:

[](auto&&... args){ return Final<decltype(args)...>(
    std::forward<decltype(args)>(args)...); }

在C ++ 17中,对于类模板参数的模板推导,Ts&&不能用作转发引用(请参阅related answer),因此隐式推理指南与您的使用无关因为你只提供左值,指南需要重新评估。但这可行:

[](auto... args){ return Final(std::move(args)...); }

答案 1 :(得分:1)

如果我正确理解了您的问题,那么您实际需要的是

template <typename ...Ts>
struct Final { ... };

constexpr auto foo = hana::make_tuple(hana::type_c<Foo1>,hana::type_c<Foo2>);
auto final_type = hana::unpack(foo, [](auto ...args) {
  return Final<typename decltype(args)::type...>;
});
// now, final_type is a hana::type<Final<Foo1, Foo2>>

您也可以使用hana::template_实现相同的目标:

constexpr auto foo = hana::make_tuple(hana::type_c<Foo1>,hana::type_c<Foo2>);
auto final_type = hana::unpack(foo, hana::template_<Final>);

我在Barry的回答中看到的问题是,您最终会创建Final<decltype(hana::type_c<Foo1>), decltype(hana::type_c<Foo2>)>,这可能不是您想要的。