大佬教程收集整理的这篇文章主要介绍了C++ 利用模板偏特化和 decltype(()) 识别表达式的值类别,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
刚刚看到一篇 C++ 博客,里面讲到用模板偏特化和 decltype()
识别值类别:lvalue
glvalue
xvalue
rvalue
prvalue
。依照博客的方法试了一下,发现根本行不通。之后,我查阅了一下 cppreference.com 关于 decltype
关键字的描述,发现了 decltype((表达式))
具有以下特性:
xvalue
,decltype
将会产生 T&&
;lvalue
,decltype
将会产生 T&
;prvalue
,decltype
将会产生 T
。也就是可以细分 xvalue
和 lvalue
,于是尝试将模板偏特化和 decltype(())
结合,发现这种方法可行。
#include <iostream>
#include <type_Traits>
template<typename T> struct is_lvalue : std::false_type {};
template<typename T> struct is_lvalue<T&> : std::true_type {};
template<typename T> struct is_xvalue : std::false_type {};
template<typename T> struct is_xvalue<T&&> : std::true_type {};
template<typename T> struct is_glvalue : std::integral_constant<bool, is_lvalue<T>::value || is_xvalue<T>::value> {};
template<typename T> struct is_prvalue : std::integral_constant<bool, !is_glvalue<T>::value> {};
template<typename T> struct is_rvalue : std::integral_constant<bool, !is_lvalue<T>::value> {};
struct A
{
int x = 1;
};
int main()
{
A a;
std::cout << std::boolalpha
<< is_lvalue<decltype(("abcd"))>::value << std::endl
<< is_glvalue<decltype(("abcd"))>::value << std::endl
<< is_xvalue<decltype(("abcd"))>::value << std::endl
<< is_rvalue<decltype(("abcd"))>::value << std::endl
<< is_prvalue<decltype(("abcd"))>::value << std::endl
<< std::endl
<< is_lvalue<decltype((a))>::value << std::endl
<< is_glvalue<decltype((a))>::value << std::endl
<< is_xvalue<decltype((a))>::value << std::endl
<< is_rvalue<decltype((a))>::value << std::endl
<< is_prvalue<decltype((a))>::value << std::endl
<< std::endl
<< is_lvalue<decltype((A()))>::value << std::endl
<< is_glvalue<decltype((A()))>::value << std::endl
<< is_xvalue<decltype((A()))>::value << std::endl
<< is_rvalue<decltype((A()))>::value << std::endl
<< is_prvalue<decltype((A()))>::value << std::endl
<< std::endl
<< is_lvalue<decltype((A().X))>::value << std::endl
<< is_glvalue<decltype((A().X))>::value << std::endl
<< is_xvalue<decltype((A().X))>::value << std::endl
<< is_rvalue<decltype((A().X))>::value << std::endl
<< is_prvalue<decltype((A().X))>::value << std::endl
;
}
输出
true
true
false
false
false
true
true
false
false
false
false
false
false
true
true
false
true
true
true
false
所有的输结果都符合预期。
以上是大佬教程为你收集整理的C++ 利用模板偏特化和 decltype(()) 识别表达式的值类别全部内容,希望文章能够帮你解决C++ 利用模板偏特化和 decltype(()) 识别表达式的值类别所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。