टेम्पलेट प्रकार के सही निर्माता को कैसे कॉल करें?


21

निम्नलिखित कोड में, मैं टिप्पणी की गई रेखा को उसी तरह से कैसे काम कर सकता हूं जैसे कि इसके ठीक ऊपर की रेखा?

मैं इसे एक सामान्य कोड बनाना चाहूंगा, जो किसी टेम्पलेट के उपयुक्त निर्माता को बुलाएगा Type

#include <string>
#include <iostream>

template <typename Type>
struct Class
{
    Type data;
    Class(Type data) : data(data) { }
};

int main()
{
    Class<std::string> a = std::string("abc");
    // Class<std::string> b = "abc";
    std::cout << a.data << std::endl;
    return 0;
}

जवाबों:


14

प्रत्यक्ष आरंभीकरण का उपयोग करें:

Class<std::string> b("abc");

17

उपयोग braced-init-सूची (या वर्दी-दीक्षा) के कहने initlize लिए Class

Class<std::string> a{ std::string("abc") };  // works
Class<std::string> b{ "abc" };               // also works

13
Class<std::string> b = "abc";

है कॉपी-प्रारंभ । यह काम नहीं करता है क्योंकि इसमें दो उपयोगकर्ता-परिभाषित रूपांतरण शामिल होंगे:

  • से const char*करने के लिए std::string,
  • से std::stringकरने के लिए Class<std::string>

लेकिन अधिकतम एक की अनुमति है।

जब आप लिखते हैं

Class<std::string> b("abc");
// or
Class<std::string> b{"abc"};

आप प्रत्यक्ष-आरंभीकरण का उपयोग करते हैं । यह काम करता है क्योंकि अब केवल एक उपयोगकर्ता-परिभाषित रूपांतरण का उपयोग किया जाता है:

  • से const char*करने के लिए std::string

0

यदि आप अपने को बदलने में सक्षम हैं Class, तो आप एक टेम्प्लेटेड कंवर्टिंग कंस्ट्रक्टर जोड़ सकते हैं। फिर आप अपने उदाहरण में लिखी गई टिप्पणी लाइन को संकलित कर पाएंगे। ध्यान दें, कि आम तौर पर बिना उचित कारण के निहितार्थ रूपांतरण का उपयोग करने की अनुशंसा नहीं की जाती है, क्योंकि वे हार्ड-टू-स्पॉट बग ( C ++ कोर गाइडलाइन्स को cf ) कर सकते हैं।

#include <string>
#include <iostream>

template <typename Type>
struct Class
{
    Type data;
    Class(Type data) : data(data) { }

    template<typename Other>
    Class(Other other_data) : data(other_data) {}
};


int main()
{
    Class<std::string> a = std::string("abc");
    Class<std::string> b = "abc";
    Class<std::string> c = a;

    std::cout << b.data << std::endl;
    return 0;
}

यदि आप C ++ 14 का उपयोग कर सकते हैं, तो आप std::literals::string_literals::operator""sकंवर्टिंग कंस्ट्रक्टर को हटा सकते हैं । तब, आपकी लाइन इस तरह दिखाई देगी:

using namespace std::literals;

Class<std::string> b = "abc"s;

यहां लाइव कोड ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.