是否可以在编译时评估使用 std::is_same<> 的此条件?
Can this condition using std::is_same<> be evaluated at compile time?
我知道constexpr
函数不必在编译时进行评估,但是如果可能的话,则可以进行评估。以下if
的条件是否在编译时间进行评估?
template <typename T> inline std::string toString(const T& arg, int decPlaces)
{
if (!std::is_same<T, float>::value && !std::is_same<T, double>::value)
return std::to_string(arg);
// Else go on strip digits after decimal point
}
我知道在C 17中有if constexpr
保证在编译时进行评估,但是我只是想知道在这种情况下是否可以在编译时间进行评估,因为从is_same
返回的bool
是constexpr
。例如在无法使用C 17的情况下。
考虑代码的此稍微修改的版本(以便控制流无法达到这种非void
函数的末尾(:
template <typename T> inline std::string toString(const T& arg, int decPlaces)
{
if (!std::is_same<T, float>::value && !std::is_same<T, double>::value)
return std::to_string(arg);
return ""; // <-- added
}
通过明确实例化T=float
的模板功能:
template std::string toString<float>(const float&, int);
然后使用g++
6.4.0 和-O2
启用,为 x86 平台生成以下汇编代码:
__Z8toStringIfESsRKT_i:
pushl %ebx
subl $40, %esp
movl 48(%esp), %ebx
leal 31(%esp), %eax
movl $LC0, 4(%esp)
movl %eax, 8(%esp)
movl %ebx, (%esp)
call __ZNSsC1EPKcRKSaIcE
addl $40, %esp
movl %ebx, %eax
popl %ebx
ret $4
上面的代码中没有任何条件。
因此,对于此编译器和平台,实际上在编译时评估了条件。您可以针对目标编译器和平台类似地进行。
如果要确定,请检查生成的程序集。但是,很有可能编译器确实会通过无条件的return
替换if
(如果T
是float
或double
(,或完全将其删除(否则(。这是一个相当基本的优化。
您将需要确保T
的所有代码路径为float
或double
,而其他代码路径则需要同时有效,以使其编译。如果if
和else
中的代码对特定类型无效,则遇到错误。
为了进行精确的优化,您需要检查装配代码。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中