अंतिम अद्यतन:2026-10-12
C++ मेंबर पॉइंटर तथा टाइप जानकारी¶
::* — अनुमान है कि 99% लोगों ने इसका उपयोग नहीं किया, यहाँ तक कि देखा भी नहीं होगा; आप कमेंट अनुभाग में लिखकर बता सकते हैं! यह अनुभाग शून्य से वाक्य-रचना समझाएगा, और एक प्रोजेक्ट के वास्तविक उदाहरण से इस उपयोग का व्यवहारिक अभ्यास कराएगा।
1.::* क्या है¶
C::* C++ की मेंबर पॉइंटर वाक्य-रचना है, जो किसी क्लास C के मेंबर की ओर इशारा करने वाले पॉइंटर को दर्शाती है। यह सिंटैक्स क्लास के मेंबर वेरिएबल या मेंबर फंक्शन की ओर इशारा करने के लिए होता है। साधारण पॉइंटर के विपरीत, मेंबर पॉइंटर किसी ऑब्जेक्ट के विशिष्ट मेमोरी पते की ओर नहीं, बल्कि क्लास के मेंबर की स्थिति की ओर इशारा करता है, और इसे क्लास के ऑब्जेक्ट इंस्टेंस के साथ प्रयोग करना आवश्यक होता है।
1.1 वाक्य-रचना (syntax)¶
T C::*क्लासCके टाइपTवाले मेंबर वेरिएबल की ओर इशारा करने वाला पॉइंटर है।R (C::*)(Args...)क्लासCके उस मेंबर फंक्शन की ओर इशारा करने वाला पॉइंटर है जिसका रिटर्न टाइपRतथा पैरामीटर सूचीArgs...है।
1.2 मेंबर वेरिएबल पॉइंटर¶
मेंबर वेरिएबल पॉइंटर किसी क्लास के मेंबर वेरिएबल की ओर इशारा करता है, जिसके लिए T C::* रूप उपयोग होता है।
उदाहरण: नीचे के उदाहरण में एक मेंबर पॉइंटर ptr परिभाषित किया गया है, जो MyClass क्लास के x मेंबर की ओर इशारा करता है। obj.*ptr मेंबर पॉइंटर द्वारा ऑब्जेक्ट के मेंबर वेरिएबल तक पहुँचता है।
struct MyClass {
int x;
double y;
};
int MyClass::*ptr = &MyClass::x;
MyClass obj;
obj.x = 10;
std::cout << "obj.x = " << obj.*ptr << std::endl;
1.3 मेंबर फंक्शन पॉइंटर¶
मेंबर फंक्शन पॉइंटर क्लास के मेंबर फंक्शन की ओर इशारा करता है, जिसके लिए R (C::*)(Args...) रूप उपयोग होता है।
उदाहरण: obj.*funcPtr() द्वारा मेंबर फंक्शन कॉल किया जाता है।
3.इसका क्या उपयोग है?¶
मान लीजिए आपके पास एक ORM फ्रेमवर्क है, जिसमें मेंबर पॉइंटर से फ़ील्ड टाइप प्राप्त कर संगत कॉलम का टाइप उत्पन्न करना है — यह इस प्रकार लिखा जा सकता है:
struct User {
std::string username;
int user_id;
};
// 自动生成数据库列的定义
template <typename T, typename C>
void generate_sql_column(T C::*member_ptr, const std::string& column_name) {
if constexpr (std::is_same_v<T, std::string>) {
std::cout << column_name << " VARCHAR(255)" << std::endl;
} else if constexpr (std::is_integral_v<T>) {
std::cout << column_name << " INT" << std::endl;
}
}
int main() {
// 假设我们想自动为 User 类生成 SQL 表结构
generate_sql_column(&User::username, "username");
generate_sql_column(&User::user_id, "user_id");
return 0;
}
4.वास्तविक प्रोजेक्ट से व्युत्पन्न उपयोगी उपकरण!¶
वास्तविक प्रोजेक्ट में, हम C::* का उपयोग करके ऑब्जेक्ट तथा मेंबर के टाइप निकाल सकते हैं — इसे कैसे कार्यान्वित करें?
उत्तर है: टेम्प्लेट + C::*
नीचे के उदाहरण से, हम value_type_from_member_pointer तथा class_type_from_member_pointer द्वारा संगत मेंबर टाइप तथा क्लास टाइप निकाल सकते हैं — बहुत सुविधाजनक उपकरण।
template <typename T, typename C>
struct from_member_pointer_helper<T C::*> {
using value_type = T;
using class_type = C;
};
template <auto Ptr>
struct from_member_pointer : from_member_pointer_helper<typename std::remove_cvref_t<decltype(Ptr)>> {};
template <auto Ptr>
using value_type_from_member_pointer = from_member_pointer<Ptr>::value_type;
template <auto Ptr>
using class_type_from_member_pointer = from_member_pointer<Ptr>::class_type;
संबंधित विषय¶
- C++ डिफ़ॉल्ट कंस्ट्रक्टर से बचना | C++那些事
- C++ क्लास इनिशियलाइज़र लिस्ट इडियम | C++那些事
- C++ में फ़ंक्शन टेम्पलेट की जगह क्लास टेम्पलेट | C++那些事
- C++ copy-and-swap इडियम | C++那些事
- C++ डिपेंडेंसी इंजेक्शन | C++那些事
- C++ enum class स्ट्रॉन्ग टाइप्ड एनम | C++那些事
- C++ Header-Only तथा कार्यान्वयन का पृथक्करण | C++那些事
- C++ लेज़ी इवैल्यूएशन इडियम | C++那些事
- C++ लुकअप टेबल इडियम | C++那些事
- C++ Mixin इडियम | C++那些事