अंतिम अद्यतन:2026-10-12
C++17 स्ट्रक्चर्ड बाइंडिंग्स¶
स्ट्रक्चर्ड बाइंडिंग्स की चर्चा से पहले, कुछ इंटरव्यू सवाल हैं, देखें आप इनके जवाब दे सकते हैं या नहीं?
-
कस्टम क्लास के प्राइवेट मेंबर्स तक स्ट्रक्चर्ड बाइंडिंग से कैसे पहुँचें?
-
कस्टम क्लास के मेंबर्स को स्ट्रक्चर्ड बाइंडिंग से कैसे बदलें?
इन सवालों के जवाब शायद ही कोई दे पाए, न सवाल नेट पर मिलते हैं न जवाब, इन्हीं सवालों से हम इस लेख की सामग्री तक आते हैं: कस्टम प्रकारों के लिए स्ट्रक्चर्ड बाइंडिंग समर्थन कैसे दें, और इसमें कौन से जाल हैं?
नोट: आलसी लोगों के लिए, जवाब और कोड 星球 पर रखे गए हैं।
इस लेख की सामग्री को और सहज बनाने के लिए, उदाहरण से शुरू करते हैं।
1. कस्टम प्रकार¶
यदि एक क्लास दी गई हो:
struct Foo {
Foo(int64_t id, std::string data) : id_(id), data_(std::move(data)) {}
void Print() { std::cout << "id = " << id_ << ", data = " << data_ << std::endl; }
private:
int64_t id_;
std::string data_;
};
नीचे दिए गए इस कोड को चालू करने के लिए:
int main() {
Foo f{12, "hello world"};
const auto& [id, data] = f;
std::cout << "id = " << id << ", data = " << data << std::endl;
f.Print();
}
सीधे चलाने पर compile होगा:
तो यह कैसे करें?
2. स्ट्रक्चर्ड बाइंडिंग समर्थन¶
इस समस्या को हम दो चरणों में हल करते हैं:
1.std::tuple_size और std::tuple_element का विशेषीकरण
namespace std {
template <>
struct tuple_size<Foo> : std::integral_constant<std::size_t, 2> {};
template <>
struct tuple_element<0, Foo> {
using type = int64_t;
};
template <>
struct tuple_element<1, Foo> {
using type = std::string;
};
}
2.ऊपर वाले स्ट्रक्चर में friend get फ़ंक्शन जोड़ें, फिर लागू कर दें:
template <std::size_t Index>
decltype(auto) get(const Foo& f);
template <>
decltype(auto) get<0>(const Foo& f) {
return f.id_;
}
template <>
decltype(auto) get<1>(const Foo& f) {
return f.data_;
}
अब यह सामान्य रूप से काम करता है, आउटपुट मिलता है:
अंत में, कुछ सवाल छोड़ते हैं:
- ऊपर दिया गया केवल पढ़ने योग्य (read-only) पहुँच है, यदि पहुँच के समय const auto & को बदला जाए तो क्या होगा?
उदाहरण के लिए:
- क्लास मेंबर्स को बदलने वाली पहुँच का समर्थन कैसे करें?
यानी, इस स्टेटमेंट को सामान्य रूप से चलाया जा सके
ठीक है, यह सेक्शन पूरा, कमेंट सेक्शन में चर्चा के लिए आपका स्वागत है।
संबंधित विषय¶
- C++17 [[nodiscard]] एट्रिब्यूट | C++那些事
- C++17 std::string_view | C++那些事
- C++17 PMR मेमोरी रिसोर्सेज़ | C++那些事
- C++17 सत्तरह उन्नत विशेषताएँ | C++那些事
- C++17 क्लास टेम्प्लेट आर्ग्युमेंट डिडक्शन CTAD | C++那些事
- C++17 optional_ref | C++那些事
- C++17 std::variant | C++那些事
- C++17 टेम्प्लेट auto डिडक्शन | C++那些事
- C++17 वेरिएबल टेम्प्लेट्स | C++那些事