কোনও টেম্পলেট ধরণের সঠিক কনস্ট্রাক্টরকে কীভাবে কল করবেন?


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তবে আপনি একটি টেম্প্লেটেড কনভার্টিং কনস্ট্রাক্টর যুক্ত করতে পারেন। তারপরে আপনি আপনার উদাহরণে লিখিতভাবে মন্তব্য করা লাইনের সংকলন করতে সক্ষম হবেন। যাইহোক, সাধারণভাবে উপযুক্ত কারণ ব্যতীত অন্তর্নিহিত রূপান্তরগুলি ব্যবহার করার পরামর্শ দেওয়া হয় না কারণ তারা হার্ড-টু স্পট বাগ (সিএফ + সি কোর গাইডলাইন ) এর ফলে তৈরি হতে পারে।

#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;

লাইভ কোড এখানে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.