সি ++ 11 এ 'টাইপডিফ' এবং 'ব্যবহার' এর মধ্যে পার্থক্য কী?


905

আমি জানি যে সি ++ 11 এ আমরা এখন usingটাইপের নাম লিখতে ব্যবহার করতে পারি , এর মতো typedef:

typedef int MyInt;

এটি, আমি যা বুঝি তার থেকে সমতুল্য:

using MyInt = int;

এবং "নতুন প্রকাশের উপায় থাকার চেষ্টা থেকে এই নতুন বাক্য গঠনটি প্রকাশ পেয়েছে template typedef:

template< class T > using MyType = AnotherType< T, MyAllocatorType >;

তবে, প্রথম দুটি নন-টেম্পলেট উদাহরণ সহ, মানের মধ্যে অন্য কোনও সূক্ষ্ম পার্থক্য রয়েছে? উদাহরণস্বরূপ, typedefs একটি "দুর্বল" উপায়ে aliasing করুন। এটি কোনও নতুন ধরণের তৈরি করে না তবে কেবল একটি নতুন নাম তৈরি করে (রূপান্তরগুলি সেই নামের মধ্যে অন্তর্ভুক্ত)।

এটি কি একই রকম usingবা এটি একটি নতুন ধরণের উত্পন্ন করে? কোন মতপার্থক্য আছে?


215
আমি ব্যক্তিগতভাবে নতুন সিনট্যাক্সটিকে পছন্দ করি কারণ এটি নিয়মিত ভেরিয়েবল অ্যাসাইনমেন্টের সাথে অনেকটা মিল, পঠনযোগ্যতা উন্নত। উদাহরণস্বরূপ, আপনি পছন্দ typedef void (&MyFunc)(int,int);বা না using MyFunc = void(int,int);?
ম্যাথিউ এম।

13
আমি পুরোপুরি একমত, আমি এখনই নতুন সিনট্যাক্সটি ব্যবহার করি। এই কারণেই আমি জিজ্ঞাসা করছিলাম, সত্যিকার অর্থে কোনও তফাত নেই।
ক্লাইম

80
@MatthieuM। এই দুটি ভিন্ন বিটিডব্লিউ। এটি হওয়া উচিত typedef void MyFunc(int,int);(যা আসলে দেখতে খারাপ দেখাচ্ছে না), বাusing MyFunc = void(&)(int,int);
আর মার্টিনহো ফার্নান্দিস

5
@ R.MartinhoFernandes কেন তুমি দরকার (&) মধ্যে using MyFunc = void(&)(int,int);? এর অর্থ MyFuncকি কোনও ফাংশনের রেফারেন্স? আপনি যদি বাদ যান এবং ?
ধনী

7
হ্যাঁ, এটি একটি ফাংশন রেফারেন্স। এর সমতুল্য typedef void (&MyFunc)(int,int);। আপনি যদি &এর সমতুল্য বাদ দেনtypedef void MyFunc(int,int);
আর মার্টিনহো ফার্নান্দিস

উত্তর:


584

তারা স্ট্যান্ডার্ড (জোর দেওয়া খনি) (7.1.3.2) থেকে সমতুল্য:

একটি টাইপিডেফ-নাম একটি উপ-ঘোষণার মাধ্যমেও চালু করা যেতে পারে। ব্যবহারকারীর কীওয়ার্ড অনুসরণ করে শনাক্তকারী একটি টাইপডেফ-নাম হয়ে যায় এবং typচ্ছিক বৈশিষ্ট্য-নির্দিষ্টকরণকারী-সিক সনাক্তকারীকে অনুসরণ করে সেই টাইপডেফ-নামের সাথে পরিচিত হয়। এটিতে একই শব্দার্থকতা রয়েছে যেমন এটি টাইপডেফ স্পেসিফায়ার দ্বারা প্রবর্তিত হয়েছিল। বিশেষত, এটি কোনও নতুন ধরণের সংজ্ঞা দেয় না এবং এটি টাইপ-আইডিতে প্রদর্শিত হবে না।


24
উত্তর থেকে, usingকীওয়ার্ডটি সুপারস্টেট বলে মনে হচ্ছে typedef। তাহলে, typdefভবিষ্যতে কি অবহেলিত হবে ?
iammilind

49
অবমূল্যায়ন অপসারণের অভিপ্রায়টি অগত্যা নির্দেশ করে না - এটি কেবল অন্য উপায়কে পছন্দ করার জন্য খুব দৃ strong় সুপারিশ হিসাবে দাঁড়িয়েছে।
আয়রন ত্রাণকর্তা

18
তবে আমি ভাবছি কেন তারা কেবল টাইপিডেফকে প্ররোচিত করার অনুমতি দেয়নি। আমার মনে আছে কোথাও পড়েছি যে তারা usingসিনট্যাক্সটি যথাযথভাবে প্রবর্তন করেছিল কারণ typedefশব্দার্থবিজ্ঞানগুলি টেমপ্লেটগুলির সাথে ভালভাবে কাজ করে না। যা usingহ'ল একরকম শব্দার্থবিজ্ঞানের সাথে সংজ্ঞায়িত সেই সত্যটির বিপরীতে ।
celtschk

12
@ এসলেটস্ক্ক: প্রস্তাবটিতে কারণ সম্পর্কে কথা বলা হয়েছে n1489। একটি টেম্পলেট উপন্যাস কোনও প্রকারের জন্য একটি উপনাম নয় , তবে একদল টেম্পলেটগুলির জন্য একটি উপাধি। typedefনতুন সিনট্যাক্সের প্রয়োজন অনুভবের মধ্যে পার্থক্য তৈরি করতে। এছাড়াও, মনে রাখবেন ওপির প্রশ্নটি নন-টেম্পলেট সংস্করণগুলির মধ্যে পার্থক্য সম্পর্কে।
জেসি গুড

4
তাহলে কেন এই অপ্রয়োজনীয় প্রথা চালু করল? একই উদ্দেশ্যে 2 বাক্য গঠন। এবং আমি আর typdefকখনও অবহেলিত হতে দেখছি না ।
বেনোইট

237

এগুলি ব্যতীত এগুলি বেশিরভাগ ক্ষেত্রে একই রকম:

উপনাম ঘোষণাটি টেমপ্লেটগুলির সাথে সামঞ্জস্যপূর্ণ, যেখানে সি স্টাইল টাইপডেফ নয়।


29
বিশেষত উত্তরের সরলতার পছন্দ এবং টাইপসেটের উত্সটি নির্দেশ করে।
g24l

1
@ g24l আপনি টাইপেইফ বলতে চাইছেন ... সম্ভবত
Marc.2377

typedefআমি জিজ্ঞাসা করতে পারলে সি এবং সি ++ এর মধ্যে পার্থক্য কী ?
ম্যাকসিনেক্স

196

ব্যবহার সিনট্যাক্স একটি সুবিধা যখন টেমপ্লেট মধ্যে ব্যবহার হয়েছে। আপনার যদি বিমূর্ততা প্রকারের প্রয়োজন হয় তবে ভবিষ্যতে নির্দিষ্ট করার জন্য টেমপ্লেট প্যারামিটারও রাখা দরকার। আপনার এমন কিছু লেখা উচিত।

template <typename T> struct whatever {};

template <typename T> struct rebind
{
  typedef whatever<T> type; // to make it possible to substitue the whatever in future.
};

rebind<int>::type variable;

template <typename U> struct bar { typename rebind<U>::type _var_member; }

কিন্তু সিনট্যাক্স ব্যবহার করা এই ব্যবহারের কেসটিকে সহজতর করে

template <typename T> using my_type = whatever<T>;

my_type<int> variable;
template <typename U> struct baz { my_type<U> _var_member; }

35
যদিও আমি ইতিমধ্যে প্রশ্নে এটি নির্দেশ। আমার প্রশ্ন আপনি যদি টেম্পলেট ব্যবহার না করেন তবে টাইপফের সাথে কোনও পার্থক্য রয়েছে। যেমন, উদাহরণস্বরূপ, আপনি যখন 'ফু ফু {init_value use ব্যবহার করেন;' 'ফু ফু (ইনি_ভ্যালু)' এর পরিবর্তে উভয়েরই একই কাজ করার কথা রয়েছে তবে ঠিক একই নিয়মটি অনুসরণ করা হবে না। তাই আমি ভাবছিলাম / টাইপেডেফ ব্যবহারের সাথে কি একই রকম লুকানো পার্থক্য রয়েছে।
ক্লাইম

24

এগুলি মূলত একই তবে এটি বেশ কার্যকর usingprovides alias templatesএকটি ভাল উদাহরণ আমি খুঁজে পেতে পারি যে:

namespace std {
 template<typename T> using add_const_t = typename add_const<T>::type;
}

সুতরাং, আমরা std::add_const_t<T>পরিবর্তে ব্যবহার করতে পারেনtypename std::add_const<T>::type


আমি যতদূর জানি, এই
স্ট্যান্ডিং

5
@ সুমনেউইথপিসি আমি কিছু যোগ করছিলাম না, এটি ইতিমধ্যে বিদ্যমান, আমি কেবল টাইপনাম ব্যবহারের একটি উদাহরণ দেখছিলাম। দয়া করে en.cppreferences.com/w/cpp/types/add_cv
ওকুলাস

9

আমি জানি মূল পোস্টারটির দুর্দান্ত উত্তর রয়েছে তবে যে কেউ এই থ্রেডটিতে হোঁচট খাচ্ছেন যেমন আমার কাছে প্রস্তাবের একটি গুরুত্বপূর্ণ নোট রয়েছে যা আমি মনে করি যে এখানে আলোচনায় মূল্যবোধের কিছু যোগ করে, বিশেষত typedefকীওয়ার্ডটি সম্পর্কে মন্তব্যগুলিতে উদ্বেগ প্রকাশ করার জন্য ভবিষ্যতে অবচয় হিসাবে চিহ্নিত করা হবে বা অপ্রয়োজনীয় / পুরানো হওয়ার কারণে সরানো হয়েছে:

এটি (পুনরায়) মূল শব্দটি টাইপএফ ব্যবহার করার পরামর্শ দেওয়া হয়েছে ... টেম্পলেট এলিয়াসগুলি প্রবর্তন করতে:

template<class T>
  typedef std::vector<T, MyAllocator<T> > Vec;

এই স্বরলিপিটির মধ্যে ইতিমধ্যে একটি প্রকারের নাম উপস্থাপনের জন্য পরিচিত একটি কীওয়ার্ড ব্যবহার করার সুবিধা রয়েছে। যাইহোক, এটি বেশ কয়েকটি অসুবিধাগুলি [sic] এর মধ্যেও প্রদর্শন করে যার মধ্যে একটি প্রকারভেদে কোনও উপ-নামকরণের জন্য একটি উপনাম প্রবর্তন করার জন্য পরিচিত একটি কীওয়ার্ড ব্যবহার করার বিভ্রান্তি যেখানে উপনাম কোনও প্রকারকে নয়, তবে একটি টেম্পলেট নির্ধারণ করে; Vecহয় না একটি টাইপ জন্য একটি alias, এবং একটি typedef-নামের জন্য গ্রহণ করা উচিত নয়। নামটি Vecপরিবারের একটি নাম std::vector<•, MyAllocator<•> >- যেখানে বুলেটটি কোনও টাইপ-নামের জন্য স্থানধারক on ফলস্বরূপ আমরা "টাইপিডেফ" সিনট্যাক্সটি প্রস্তাব করি না the অন্যদিকে বাক্যটি বাক্যটিতে

template<class T>
  using Vec = std::vector<T, MyAllocator<T> >;

এটি পড়তে / ব্যাখ্যা করা যায়: এখন থেকে, আমি এর Vec<T>প্রতিশব্দ হিসাবে ব্যবহার করবstd::vector<T, MyAllocator<T> > । সেই পাঠের সাথে, এলিয়াসিংয়ের জন্য নতুন সিনট্যাক্সটি যুক্তিসঙ্গত মনে হয়।

আমার কাছে এটি typedefসি -++ তে কীওয়ার্ডটির জন্য ক্রমাগত সমর্থন বোঝায় কারণ এটি কোডটি আরও পাঠযোগ্য এবং বোধগম্য করতে পারে

usingকীওয়ার্ডটি আপডেট করা বিশেষত টেম্পলেটগুলির জন্য ছিল এবং আপনি যখন নন-টেম্পলেটগুলির সাথে কাজ করছেন usingএবং typedefযান্ত্রিকভাবে অভিন্ন হন, তখন পছন্দটি সম্পূর্ণরূপে পঠনযোগ্যতা এবং অভিপ্রায় যোগাযোগের ভিত্তিতে প্রোগ্রামারটির উপর নির্ভর করে word ।


2

উভয় কীওয়ার্ড সমান, তবে কয়েকটি গুপ্তচর রয়েছে। একটি হ'ল এটির সাথে ফাংশন পয়েন্টার ঘোষণা using T = int (*)(int, int);করা আরও পরিষ্কার typedef int (*T)(int, int);। দ্বিতীয়টি হ'ল টেমপ্লেট ওরফে ফর্মটি দিয়ে সম্ভব নয় typedef। তৃতীয়টি হ'ল সি এপিআই প্রকাশের typedefজন্য পাবলিক শিরোনামে প্রয়োজন।

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