首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >韩佳::元组汽车&.参数

韩佳::元组汽车&.参数
EN

Stack Overflow用户
提问于 2017-04-22 16:03:38
回答 2查看 429关注 0票数 3

有没有一种方法可以使用这样的东西:

代码语言:javascript
复制
constexpr auto foo = hana::make_tuple(hana::type_c<Foo1>,hana::type_c<Foo2>);

有这样的东西:

代码语言:javascript
复制
template < typename ... Ts >
struct Final {

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-22 16:32:52

问题就在你的羔羊身上:

代码语言:javascript
复制
[](auto && ... args){ return Final(args...); }
//                          ~~~~~~~

Final不是一种类型,而是一个类模板。因此,您需要显式地提供类型。类似于:

代码语言:javascript
复制
[](auto&&... args){ return Final<decltype(args)...>(
    std::forward<decltype(args)>(args)...); }

在C++17中,使用类模板参数的模板演绎,Ts&&不充当转发引用(请参阅related answer),因此隐式演绎指南无论如何都与您的用法不匹配,因为您只提供lvalue,指南需要重值。但这样做是可行的:

代码语言:javascript
复制
[](auto... args){ return Final(std::move(args)...); }
票数 4
EN

Stack Overflow用户

发布于 2017-04-23 19:28:57

如果我正确理解你的问题,你要找的是

代码语言:javascript
复制
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_实现相同的功能。

代码语言:javascript
复制
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>)>,这可能不是您想要的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43561382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档