C++ 利用模板偏特化和 decltype(()) 识别表达式的值类别
2022/1/19 9:04:34
本文主要是介绍C++ 利用模板偏特化和 decltype(()) 识别表达式的值类别,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
刚刚看到一篇 C++ 博客,里面讲到用模板偏特化识别值类别:lvalue
glvalue
xvalue
rvalue
pravlue
。依照博客的方法试了一下,发现根本行不通。只用模板偏特化只能区分 lvalue
和 rvalue
,无法进行细分。之后,我查阅了一下 cppreference.com 关于 decltype
关键字的描述,发现了 decltype((表达式))
具有以下特性:
- 如果 表达式 的值类别是亡值,
decltype
将会产生T&&
; - 如果 表达式 的值类别是左值,
decltype
将会产生T&
; - 如果 表达式 的值类别是纯右值,
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(()) 识别表达式的值类别的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升