ในบทความนี้ เราจะพูดถึงการทำงาน ไวยากรณ์ และตัวอย่างของ template std::is_reference ใน C++ STL
is_reference เป็น template ที่อยู่ใน header <type_traits> ใช้ตรวจสอบว่าชนิด T ที่กำหนดเป็น reference type หรือไม่
Template นี้เป็นการรวมของ is_rvalue_reference และ is_lvalue_reference หากอย่างใดอย่างหนึ่งเป็น true ผลลัพธ์ของ is_reference ก็จะเป็น true
Reference ใน C++ คืออะไร?
Reference คือชื่อเรียกอื่น (alias) ของตัวแปรที่มีอยู่แล้ว Reference ต่างจาก Pointer ดังนี้:
- ไม่สามารถตั้งค่า reference เป็น null ได้ แต่ pointer สามารถเป็น null pointer ได้
- เมื่อ reference ถูก initialize กับออบเจกต์แล้ว ไม่สามารถเปลี่ยนไปชี้ออบเจกต์อื่นได้ Pointer สามารถเปลี่ยนได้ตลอดเวลา
- Reference ต้อง initialize ตอนสร้าง Pointer สามารถ initialize ภายหลังได้
ประกาศ reference ด้วยสัญลักษณ์ & นำหน้าตัวแปรที่ต้องการอ้างอิง
ไวยากรณ์
template <class T> is_reference;
พารามิเตอร์
Template รับพารามิเตอร์เพียงอย่างเดียวคือชนิด T ตรวจสอบว่าเป็น reference type หรือไม่
ค่าที่คืน
คืนค่า Boolean: true หาก T เป็น reference type, false หากไม่ใช่
ตัวอย่าง
Input: is_reference<int>::value; Output: false Input: is_reference<int&>::value; Output: true Input: is_reference<int&&>::value; Output: true
ตัวอย่างโค้ด
#include <iostream>
#include <type_traits>
using namespace std;
int main() {
cout << boolalpha;
cout << "Checking for is_reference: ";
cout << "\n int: " << is_reference<int>::value;
cout << "\n int&: " << is_reference<int&>::value;
cout << "\n int&&: " << is_reference<int&&>::value;
cout << "\n char: " << is_reference<char>::value;
cout << "\n char&: " << is_reference<char&>::value;
cout << "\n char&&: " << is_reference<char&&>::value;
cout << "\n float: " << is_reference<float>::value;
cout << "\n float&: " << is_reference<float&>::value;
cout << "\n float&&: " << is_reference<float&&>::value;
cout << "\n double: " << is_reference<double>::value;
cout << "\n double&: " << is_reference<double&>::value;
cout << "\n double&&: " << is_reference<double&&>::value;
return 0;
}
เอาต์พุต
Checking for is_reference: int: false int&: true int&&: true char: false char&: true char&&: true float: false float&: true float&&: true double: false double&: true double&&: true