विषय पर बढ़ें

अंतिम अद्यतन: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 होगा:

 cannot decompose inaccessible member 'Foo::id_' of 'const Foo'
   42 |   const auto& [id, data] = f;

तो यह कैसे करें?

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_;
}

अब यह सामान्य रूप से काम करता है, आउटपुट मिलता है:

id = 12, data = hello world
id = 12, data = hello world

अंत में, कुछ सवाल छोड़ते हैं:

  • ऊपर दिया गया केवल पढ़ने योग्य (read-only) पहुँच है, यदि पहुँच के समय const auto & को बदला जाए तो क्या होगा?

उदाहरण के लिए:

auto& [id, data] = f;
  • क्लास मेंबर्स को बदलने वाली पहुँच का समर्थन कैसे करें?

यानी, इस स्टेटमेंट को सामान्य रूप से चलाया जा सके

auto& [id, data] = f;

ठीक है, यह सेक्शन पूरा, कमेंट सेक्शन में चर्चा के लिए आपका स्वागत है।

संबंधित विषय

टिप्पणियाँ