ISO/IEC C++ China Unofficial

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 415|回复: 6

模板可变参解包

[复制链接]

8

主题

64

帖子

269

积分

超级版主

Rank: 8Rank: 8

威望
12
经验
169
贡献
12
发表于 2015-12-3 11:04:46 | 显示全部楼层 |阅读模式
有个需求大概是这样↓
  1. template <class... Ts>
  2. struct Foo
  3. {
  4.     std::aligned_storage_t<max_sizeof<Ts...>(), max_alignof<Ts...>()> bar;
  5. };
复制代码

其中的max_sizeof、max_alignof目前采用递归方式实现↓
  1. template<class T, class... Ts, std::enable_if_t<(sizeof...(Ts) > 0)>* = 0>
  2. constexpr std::size_t max_sizeof(std::size_t max_size = 0)
  3. {
  4.     return max_sizeof<Ts...>(std::max(sizeof(T), max_size));
  5. }

  6. template<class T>
  7. constexpr std::size_t max_sizeof(std::size_t max_size = 0)
  8. {
  9.     return std::max(sizeof(T), max_size);
  10. }
复制代码

行数略多,但觉不爽。。。有么有办法通过std::max+unpack一发搞定?Like this↓
  1. std::max({ /* Some magic here */ })
复制代码

回复

使用道具 举报

10

主题

108

帖子

507

积分

超级版主

RA2DIY 特别行政区行政长官

Rank: 8Rank: 8

威望
4
经验
388
贡献
3
发表于 2015-12-3 12:02:19 | 显示全部楼层
ヲ的办法还是自己写 max,因为虽然 C++14 要求 std::max 是 constexpr 修饰的,但是具体下来 std::max 能不能支持 constexpr 很看脸。

某种意义上讲标准库也是样样通样样松。

点评

好吧,的确看到vs2015中initializer_list版重载并非constexpr。。。因为错误信息没有反映这个,之前未能发现是这个问题_(:3」∠)_  发表于 2015-12-3 14:20
We will prevail!! www.lhmouse.com
回复 支持 反对

使用道具 举报

1

主题

16

帖子

73

积分

超级版主

Rank: 8Rank: 8

威望
0
经验
57
贡献
0
发表于 2015-12-4 10:21:15 | 显示全部楼层
我怎么觉得行数不多 果然你们都是精益求精啊
回复 支持 反对

使用道具 举报

1

主题

16

帖子

73

积分

超级版主

Rank: 8Rank: 8

威望
0
经验
57
贡献
0
发表于 2015-12-4 10:21:54 | 显示全部楼层
这个表情竟然没笑, 补一个, ><

点评

收下! ゚ ✧˖ ٩( 'ω' )و ✧ ˖゚キラー  发表于 2015-12-4 11:07
回复 支持 反对

使用道具 举报

0

主题

1

帖子

18

积分

新手上路

Rank: 1

威望
0
经验
17
贡献
0
发表于 昨天 15:38 | 显示全部楼层
顶你一下,好贴要顶!    http://www.aacbu.com  ,可以边工作边赚钱哦!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|ISO/IEC C++ China Unofficial

GMT+8, 2017-12-18 09:27 , Processed in 0.051151 second(s), 23 queries , XCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表