ট্রিলিং রিটার্ন টাইপের সিনট্যাক্স স্টাইলটি নতুন সি ++ ১১ টি প্রোগ্রামের জন্য ডিফল্ট হওয়া উচিত? [বন্ধ]


92

সি ++ 11 একটি নতুন ফাংশন সিনট্যাক্স সমর্থন করে:

auto func_name(int x, int y) -> int;

বর্তমানে এই ফাংশনটি হিসাবে ঘোষণা করা হবে:

int func_name(int x, int y);

নতুন স্টাইলটি এখনও ব্যাপকভাবে গৃহীত হয়েছে বলে মনে হয় না (জিসিসি এসটিএল বলুন)

যাইহোক, নতুন সি ++ 11-প্রোগ্রামগুলিতে সর্বদা এই নতুন স্টাইলটি পছন্দ করা উচিত, বা এটি কেবল যখন প্রয়োজন হবে তখনই ব্যবহৃত হবে?

ব্যক্তিগতভাবে, আমি যখন সম্ভব তখন পুরানো শৈলীর পছন্দ করি তবে মিশ্র শৈলীর সাথে একটি কোড-বেস দেখতে বেশ কুরুচিপূর্ণ।


29
এটি বেশিরভাগ ক্ষেত্রে decltypeতর্ক করার জন্য।
বিড়াল প্লাস প্লাস

ক্যাটপ্লাস প্লাস কী বলে: এটি আপনার উদাহরণে ব্যবহার করে খুব একটা বোধগম্য হবে না
স্টিঞ্জ করুন

@ গুগল প্লাস প্লাস এর অর্থ হল যে আপনি জিনিসগুলি সি ++ তে আছেন তেমন ফেলে রাখেন, যদি না আপনি ফেরতের ধরণের প্রয়োজন হয়?
মিরক

4
কুশল প্রতিটি ফাংশনের সামনে "অটো" নির্দিষ্ট করতে হবে। এটি কি সি ++ এর অদ্ভুত উত্তরটির মতো অজগরটির "ডিএফ"?
এরিক অ্যারোনস্টি

উত্তর:


110

কিছু নির্দিষ্ট ক্ষেত্রে রয়েছে যেখানে আপনাকে অবশ্যই অনুসরণীয় রিটার্ন টাইপ ব্যবহার করতে হবে। উল্লেখযোগ্যভাবে, একটি ল্যাম্বদা রিটার্ন টাইপ, যদি নির্দিষ্ট করা থাকে তবে অবশ্যই একটি ট্রিলিং রিটার্ন টাইপের মাধ্যমে নির্দিষ্ট করা আবশ্যক। এছাড়াও, যদি আপনার রিটার্ন টাইপ decltypeএমন একটি ব্যবহার করে যাতে আর্গুমেন্টের নাম সুযোগের প্রয়োজন হয় তবে একটি পিছনের রিটার্ন টাইপ ব্যবহার করা আবশ্যক (তবে, declval<T>এই সমস্যাটি প্রায়শই ব্যবহার করতে পারেন কেউ সাধারণত )।

পেছনের রিটার্ন টাইপের কিছু অন্যান্য ছোট ছোট সুবিধা রয়েছে। উদাহরণস্বরূপ, functionতিহ্যবাহী ফাংশন সিনট্যাক্স ব্যবহার করে একটি অন-ইনলাইন সদস্য ফাংশন সংজ্ঞা বিবেচনা করুন:

struct my_awesome_type
{
    typedef std::vector<int> integer_sequence;

    integer_sequence get_integers() const;
}; 

my_awesome_type::integer_sequence my_awesome_type::get_integers() const
{
    // ...
}

ক্লাসের নাম আগে উপস্থিত না হওয়া অবধি সদস্য টাইপিডগুলি সুযোগ নেই ::get_integers, সুতরাং আমাদের ক্লাসের যোগ্যতাটি দুবার পুনরায় করতে হবে। যদি আমরা একটি পিছনের রিটার্ন টাইপ ব্যবহার করি তবে আমাদের প্রকারের নামটি পুনরাবৃত্তি করার দরকার নেই:

auto my_awesome_type::get_integers() const -> integer_sequence
{
    // ...
}

এই উদাহরণে, এটি এত বড় ব্যাপার নয়, তবে আপনার যদি দীর্ঘ শ্রেণীর নাম বা শ্রেণি টেম্পলেটগুলির সদস্য ফাংশনগুলি থাকে যা ইনলাইন সংজ্ঞায়িত হয় না, তবে এটি পঠনযোগ্যতায় একটি বড় পার্থক্য করতে পারে।

সি ++ নাও ২০১২-তে তাঁর "ফ্রেশ পেইন্ট" অধিবেশনটিতে অ্যালিসডায়ার মেরেডিথ উল্লেখ করেছিলেন যে আপনি যদি ধারাবাহিকভাবে রিটার্নের ধরণগুলি ব্যবহার করেন তবে আপনার সমস্ত ফাংশনের নাম ঝরঝরে রয়েছে:

auto foo() -> int;
auto bar() -> really_long_typedef_name;

আমি সর্বত্র আগমন ধরনের trailing ব্যবহার করেছি CxxReflect , কেমন কোড সৌন্দর্য তাদের ধারাবাহিকভাবে ব্যবহার একটি উদাহরণ খুঁজছেন তাই যদি, আপনি একটি বর্ণন সেখানে (যেমন, গ্রহণ করতে পারেন বর্গ )।type


4
এটি দেখে মনে হচ্ছে না যে কোনও sensক্যমত্য রয়েছে তবে এটি নতুন স্টাইলে সিএক্সএক্সআরফ্লিক্টের দিকে নজর দেওয়া আকর্ষণীয়।
মিরক

হাই জেমস. এই উত্তরটি সম্ভবত C ++ 14 স্ট্যান্ডার্ডের আলোকে আরও সঠিক করা যেতে পারে।
ড্রু ডোরম্যান

@ ড্র্রুডোরম্যান আপনি কি যুক্ত করবেন / পরিবর্তন করবেন?
আন্ডারস্কোর_ড ২

প্রান্তিককরণ আসলে একটি বড় প্লাস, আমি চাইতাম যে এখানে অর্থহীন 'অটো' প্রতিস্থাপনের জন্য একটি নতুন 'ফানক' কীওয়ার্ড থাকবে।
জোহান বুলি

67

অন্যেরা যা বলেছিল তা ছাড়াও, পিছনের ফেরতের ধরণটিও ব্যবহার করতে দেয় this, যা অন্যথায় অনুমোদিত নয়

struct A {
  std::vector<int> a;

  // OK, works as expected
  auto begin() const -> decltype(a.begin()) { return a.begin(); }

  // FAIL, does not work: "decltype(a.end())" will be "iterator", but 
  // the return statement returns "const_iterator"
  decltype(a.end()) end() const { return a.end(); }
};

দ্বিতীয় ঘোষণায় আমরা প্রচলিত শৈলী ব্যবহার করেছি used তবে যেহেতু thisসেই অবস্থানে অনুমোদিত নয়, সংকলক সুস্পষ্টভাবে এটি ব্যবহার করে না। সুতরাং এটির ওভারলোডটি কী কল করতে চলেছে তা নির্ধারণ a.end()করতে স্ট্যাটিক্যালি ঘোষিত প্রকারটি ব্যবহার করে , যা নন-কনস্ট্যান্ট সংস্করণ হিসাবে শেষ হয়।aendvector<int>


4
যদিও এটি ধারণার একটি ভাল / ঝরঝরে প্রদর্শন আছে (রিটার্নের ধরণের সদস্যদের ব্যবহার করে), এটি মজার বিষয় যেহেতু সি ++ 14 এ কোনও ধরণের কোনও রূপান্তর ছাড়াই একটি ইনলাইন সংজ্ঞায় সম্পূর্ণ অপ্রয়োজনীয়; আমরা এখন পুরো রিটার্ন টাইপের ছাড় ব্যবহার করতে পারি। : পি
আন্ডারস্কোর_২২

27

আরেকটি সুবিধা হ'ল ফাংশনটি কোনও ফাংশনে একটি পয়েন্টার ফেরত দিলে ট্রেলিং-রিটার্ন-টাইপের সিনট্যাক্স আরও পঠনযোগ্য হতে পারে। উদাহরণস্বরূপ, তুলনা করুন

void (*get_func_on(int i))(int);

সঙ্গে

auto get_func_on(int i) -> void (*)(int);

যাইহোক, কেউ যুক্তি দিতে পারেন যে ফাংশন পয়েন্টারের জন্য টাইপ ওরফে প্রবর্তন করে আরও ভাল পাঠযোগ্যতা অর্জন করা যায়:

using FuncPtr = void (*)(int);
FuncPtr get_func_on(int i);

10

এই দুর্দান্ত নিবন্ধটি দেখুন: http://www.cprogramming.com/c++11/c++11-auto-decltype-return-value- after-function.html খেলায় ডিক্লাইপ ছাড়াই এই বাক্য গঠনটি ব্যবহার করার সময় খুব ভাল উদাহরণ :

class Person
{
public:
    enum PersonType { ADULT, CHILD, SENIOR };
    void setPersonType (PersonType person_type);
    PersonType getPersonType ();
private:
    PersonType _person_type;
};

auto Person::getPersonType () -> PersonType
{
    return _person_type;
}

অ্যালেক্স অ্যালাইনের নিবন্ধ থেকে উজ্জ্বল ব্যাখ্যাটিও চুরি হয়েছে "কারণ ফেরতের মান ফাংশনের শেষে চলে যায়, তার পরিবর্তে, আপনাকে শ্রেণির সুযোগ যুক্ত করার দরকার নেই।"

এই সম্ভাব্য মামলার সাথে তুলনা করুন যখন দুর্ঘটনাক্রমে কেউ শ্রেণির সুযোগগুলি ভুলে যায় এবং আরও বড় বিপর্যয়ের জন্য আরেকটি পার্সোনটাইপ বিশ্বব্যাপী স্কোপে সংজ্ঞায়িত হয়:

typedef float PersonType; // just for even more trouble
/*missing: Person::*/
PersonType Person::getPersonType ()
{
    return _person_type;
}

7
আমি নিশ্চিত নই যে এটি "বিপর্যয়" বিভাগে চলেছে: টাইপটি ভুল হলে কোডটি সংকলন করবে না। রানটাইম ত্রুটিগুলি বিপর্যয়কর পরিণতি হতে পারে; সংকলন সময় ত্রুটি, এত না।
জেমস ম্যাকনেলিস

4
@ জেমস ম্যাকনেলিস কম্পাইলার আউটপুটটির তুলনা করুন: prog.cpp:13:12: error: prototype for 'PersonType Person::getPersonType()' does not match any in class 'Person'বনাম। prog.cpp:13:1: error: 'PersonType' does not name a type কমপাইলার থেকে প্রথম ত্রুটিটি আমার পক্ষে কমপক্ষে, এটি আরও খারাপ।
পাইট্রনাইজজ

ব্যক্তিগতভাবে আমি একমত নই, আমি দ্বিতীয় বার্তাটি পড়া আরও কঠিন মনে করি এবং এর পরিবর্তে আমি ঘোষণার মতো দেখতে চাই।
19:58
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.