hana::tuple 这个 && ... 参数
hana::tuple to auto && ... args
有没有办法使用类似的东西:
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 类型。
基本上我想创建一个接受参数列表的类型,但我有一个包含参数的元组。
问题出在你的 lambda 中:
[](auto && ... args){ return Final(args...); }
// ~~~~~~~
Final
不是类型,它是 class 模板。因此,您需要明确提供类型。类似于:
[](auto&&... args){ return Final<decltype(args)...>(
std::forward<decltype(args)>(args)...); }
在 C++17 中,对于 class 模板参数进行模板推导,Ts&&
不作为转发引用(参见 ),因此隐式推导指南无论如何都不会匹配您的用法,因为您只提供左值并且指南需要重估。但这行得通:
[](auto... args){ return Final(std::move(args)...); }
如果我没有正确理解你的问题,那么你真正要找的是
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>)>
,这可能不是你想要的。
有没有办法使用类似的东西:
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 类型。
基本上我想创建一个接受参数列表的类型,但我有一个包含参数的元组。
问题出在你的 lambda 中:
[](auto && ... args){ return Final(args...); }
// ~~~~~~~
Final
不是类型,它是 class 模板。因此,您需要明确提供类型。类似于:
[](auto&&... args){ return Final<decltype(args)...>(
std::forward<decltype(args)>(args)...); }
在 C++17 中,对于 class 模板参数进行模板推导,Ts&&
不作为转发引用(参见
[](auto... args){ return Final(std::move(args)...); }
如果我没有正确理解你的问题,那么你真正要找的是
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>)>
,这可能不是你想要的。