作者loveflames (咕啾咕啾魔法阵)
看板C_and_CPP
标题Re: [问题] cannot appear in a constant-expression
时间Mon Mar 13 00:52:03 2017
看到constexpr,想稍微聊在metaprogramming的妙用
template的non-type参数不吃浮点数
(之前查好像之後某个版本会全面开放字面值,不太确定)
在数值计算上应用有限,而且语法艰涩
而constexpr函数吃浮点数,语法容易
大家对於constexpr的认识大多是这样
不过实际上可以拿来做non-constant constant expression
意思就是表面上看起来同一个函数,输入也相同,每次的输出却不一致
http://b.atch.se/posts/constexpr-counter/
其中一种应用是counter
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 180.217.205.7
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1489337528.A.936.html
1F:推 ilikekotomi: 感谢分享 有空来仔细研究一下 03/13 00:57
TMP需要的前置知识,连这篇没提到的也说说好了
1.SFINAE
函数模板匹配失败後找优先权更低的函数或函数模板
2.ADL
根据argument找函数
3.friend name injection
在class内部放friend函数宣告,找到定义在其他class的friend函数
4.sizeof
算函数的返回大小,函数只有宣告即可
5.pointer-to-member operator
能判断是否class type
6.模板本体可不定义,只定义特化
7.CRTP
例如这样
class T:base<T>{};
用途嘛....policy-based design之类
可能会再搭个多重继承
8.variadic template + 多重继承
光列出来可能不知道能干嘛,我讲typelist你就懂了
里面可以搭tuple跟fold expression(C++17)
2F:推 lovejomi: 请问第三点可否提供一些资源,想了解一下 03/13 11:25
直接给你一个范例
class U;
struct T{
friend void f(U*){...}
};
struct U{
friend void f(U*);
};
例如这样用
U* x;
f(x);
以ADL来找f是否在U中
再以friend name injection让U可见void f(U*)
3F:推 ilikekotomi: 大大你人真好 连我TMP不熟料想到了XD 03/13 15:25
※ 编辑: loveflames (60.248.56.181), 03/13/2017 15:37:33
4F:→ ilikekotomi: reader的部分不懂 为何选择了return R来递回 03/13 16:33
5F:→ loveflames: 因adl_flag还没定义,adl_flag是在最後透过write定义 03/13 16:43
6F:→ ilikekotomi: 大概有概念 a的那次由write定义adl_flag(flag<1>) 03/13 17:06
7F:→ ilikekotomi: b遇到reader(0,flag<1>)会改走return N的 03/13 17:07
8F:→ ilikekotomi: 我用flag<3>自己人脑展开大概是这种感觉 03/13 17:09
9F:→ loveflames: 我忘了提一个noexcept 03/13 19:36
10F:→ loveflames: 可以用来判断constexpr是否能在编译期求出 03/13 19:45
11F:→ loveflames: 连constexpr函数是否定义都能判断 03/13 19:45
12F:→ LPH66: 其实我个人认为用 noexcept 问有没有这个 constexpr 03/13 19:52
13F:→ LPH66: 某种程度上算是那种非正常用法 XD 03/13 19:52
14F:→ LPH66: 嘛不过这连结里的东西都是这种非正常用法就是了 03/13 19:52
15F:推 lovejomi: 请问这范例跟tmp有什麽正相关吗?没有很懂 03/13 22:51
16F:→ loveflames: 这范例用到我列举的东西 03/13 23:26