কেন সি ++ তে টিপলসের ব্যবহার বেশি সাধারণ হয় না?


124

কেন কেউ বুলেট টিপল লাইব্রেরি বা টিআর 1 এর জন্য স্ট্যান্ডার্ড লাইব্রেরি সি ++ এ টিউপস ব্যবহার করবেন বলে মনে হচ্ছে না ? আমি প্রচুর সি ++ কোড পড়েছি এবং খুব কমই আমি টিপলসের ব্যবহার দেখতে পাই তবে আমি প্রায়শই এমন অনেক জায়গা দেখি যেখানে টিপলস অনেকগুলি সমস্যার সমাধান করে (সাধারণত ফাংশন থেকে একাধিক মান ফেরত)।

টিপলস আপনাকে এ জাতীয় ধরণের সমস্ত ধরণের জিনিস করতে দেয়:

tie(a,b) = make_tuple(b,a); //swap a and b

এটি অবশ্যই এর চেয়ে ভাল:

temp=a;
a=b;
b=temp;

অবশ্যই আপনি সর্বদা এটি করতে পারেন:

swap(a,b);

কিন্তু আপনি যদি তিনটি মান ঘোরাতে চান? আপনি টিপলস দিয়ে এটি করতে পারেন:

tie(a,b,c) = make_tuple(b,c,a);

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

আমি যে টিপলগুলি নিয়ে ভাবছি না সেগুলির কোনও বড় ধরনের ত্রুটি রয়েছে? যদি তা না হয় তবে কেন এগুলি খুব কম ব্যবহার করা হয়? তারা ধীর হয়? নাকি এটা ঠিক যে মানুষ তাদের অভ্যস্ত হয় না? টিপলস ব্যবহার করা কি ভাল ধারণা?


17
চতুর টিপল অদলবদল কৌতুক জন্য +1 :)
kizzx2

10
a = a ^ b; b = a ^ b; a = a ^ b;
জেরার্ডো মার্সেট

3
আইএমও টিপলগুলি দুর্বল টাইপিং ভাষা বা ভাষাগুলিতে যেগুলি সেগুলি স্থানীয় কাঠামো convenient উদাহরণস্বরূপ পাইথন বা পিএইচপি এগুলি কেবল জীবনকে সহজ করে তোলে, যখন সি ++ তে খুব বেশি টাইপিং রয়েছে (এটি টেম্পলেট থেকে তৈরি করতে) এবং খুব কম সুবিধা।
ডক

4
ওপিকে একটি মন্তব্য: আমি মনে করি যে বর্তমান গৃহীত উত্তর ইতিমধ্যে সত্যত ভুল হওয়ার দিক থেকে অপ্রচলিত। আপনি গৃহীত উত্তরের পছন্দটি নিয়ে পুনর্বিবেচনা করতে চাইতে পারেন।
ulidtko

8
@ গেরার্ডোমারসেট আপনি কি গুরুতর?
থেইসেন্ট

উত্তর:


43

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


1
লোকেরা বুস্টের অন্যান্য অংশগুলি পাগলের মতো ব্যবহার করে বলে মনে হচ্ছে। যদিও অবশ্যই হ্যাশ ম্যাপস টিপলসের চেয়ে সাধারণভাবে অনেক বেশি কার্যকর।
জিফ্রে

আপনি যা দেখছেন তার সুনির্দিষ্ট বিবরণ আমি জানি না, তবে আমি অনুমান করছি যে লোকেরা পাগলের মতো ব্যবহার করছে সেগুলি এমন বৈশিষ্ট্য যা তারা সত্যই সত্যই চেয়েছিল। সুতরাং (আবার অনুমান করা) হ্যাশ মানচিত্রের জনপ্রিয়তা, গণনা করা পয়েন্টার এবং এর মতো। টিপলটি সুবিধাজনক, তবে এটি এমন কোনও জিনিস নয় যা কোনও গর্ত পূরণ করতে লাফিয়ে বেরিয়ে আসে। বেতনটি সুস্পষ্ট নয়। আপনার ঠিক কতবার N অবজেক্ট ঘোরানো দরকার? (ইচ্ছামত দীর্ঘ ভেক্টর ঘোরানোর প্রয়োজনের বিপরীতে)। এবং মানুষ হয় হয় রেফারেন্স দ্বারা রিটার্ন মান পাস, বা ছোট ক্লাস বা স্ট্রাক্ট ফিরে আসার অভ্যস্ত।
অ্যালান ডি স্মেট


124

একটি ছদ্মবেশী উত্তর হ'ল অনেক লোক সি ++ এ প্রোগ্রাম করে তবে উচ্চতর স্তরের কার্যকারিতা বোঝে না এবং / বা ব্যবহার করে না। কখনও কখনও এটি তাদের অনুমতিপ্রাপ্ত না হওয়ার কারণে হয় তবে অনেকগুলি কেবল চেষ্টা করে না (বা এমনকি বোঝে)।

অ-বৃদ্ধির উদাহরণ হিসাবে: কত জন লোকের মধ্যে কার্যকারিতা পাওয়া যায় <algorithm>?

অন্য কথায়, অনেক সি ++ প্রোগ্রামার হ'ল সি ++ কম্পাইলার ব্যবহার করে সি প্রোগ্রামার, এবং সম্ভবত std::vectorএবং std::list। এটি ব্যবহারের boost::tupleবেশি সাধারণ না হওয়ার এক কারণ ।


18
আমার কাছ থেকে -1 কারণ সি ++ প্রোগ্রামাররা বোবা নয় যতটা এই উত্তরটি তাদের শব্দ করে তোলে।
ব্যবহারকারী541686

5
@ মেহরদাদ প্রচুর পরিমাণে সি ++ কোড দেখেছেন, প্রচুর পরিমাণে সি ++ উপাদান পড়ছেন, আমি মনে করি এটি নিরাপদ বলে মনে করি যে "সি ++" বিকাশকারীদের একটি খুব বড় অংশ কেবল সি বিকাশকারী যারা খাঁটি পেতে পারেননি সি সংকলক। উদাহরণস্বরূপ, টেমপ্লেটগুলি বেশিরভাগ উপকরণ থেকে পুরোপুরি অনুপস্থিত (এমন কিছু যা আমি অনেক কিছু শিখতে শিখেছি)। অদ্ভুত ম্যাক্রো হ্যাকগুলি সাধারণ এবং নেমস্পেস মারাত্মকভাবে নিযুক্ত।
ক্লিয়ারার

5
বোকা উত্তর। কারও যদি তাদের প্রয়োজন হয় তবে তারা তাদের সাথে ধরা দেবে। তাদের প্রয়োজন হয় না; সুতরাং তারা ব্যবহার করা হয় না। এগুলি যে সহজে ব্যবহার করা হয় তা বোঝা যায় না বলে এটি খারাপ।
মাইকেল চোরডাকিস

9
@ মিশেল ননসেন্স মন্তব্য। আপনি একবার কোনও ভাষার টুরিং সম্পূর্ণ উপসেট পেয়ে গেলে প্রোগ্রামিংয়ে কিছুই করার প্রয়োজন হয় না। ব্যবহারের অভাব অবশ্যই এটিকে বোঝায় না যে প্রত্যেকে উচ্চ স্তরের সি ++ টি নির্মানগুলি বোঝে এবং সেগুলি ব্যবহার না করার জন্য পছন্দ করে।
ট্রে জ্যাকসন

4
টিবিএইচআই এর আগে কখনও ভেরিয়াদিক টেমপ্লেট রূপকগুলির বাইরে স্টাড :: টিপলের প্রয়োজন ছিল না। "আমি যদি এই টিপলসই থাকি তবে" ভাবতে ভাবতে দুঃখী মুখ নিয়ে বসেছিলাম এমন জীবনের কোনও লাভ নেই। আসলে আমি যখন টিপলসটির দিকে তাকাই তখন আমার মনে হয় "তাদের কী দরকার হ'ল তাদের জন্য কী দরকার (আমি নিজেকে বোকা মনে করব না")। মেটা-প্রোগ্রামিংয়ের বাইরের লোকেরা এগুলিকে "বেনামে স্ট্রাক্ট" হিসাবে ব্যবহার করে বলে মনে হয় যা এটি অত্যন্ত কুশ্রী এবং তাদের মাথায় কোডের মান এবং রক্ষণাবেক্ষণের দৃability় অনুপস্থিতি নির্দেশ করে।
থেইসেন্ট

23

সি ++ টিপল সিনট্যাক্স বেশিরভাগ লোকের চেয়ে কিছুটা বেশি ভার্বোজ হতে পারে।

বিবেচনা:

typedef boost::tuple<MyClass1,MyClass2,MyClass3> MyTuple;

সুতরাং আপনি যদি টিউপসগুলির বিস্তৃত ব্যবহার করতে চান আপনি হয় সর্বত্র টিউপল টাইপডেফ পান বা আপনি বিরক্তিকরভাবে দীর্ঘতর টাইপের নাম সর্বত্র পাবেন। আমি টিপলস পছন্দ করি প্রয়োজনে আমি এগুলি ব্যবহার করি। তবে এটি সাধারণত এন-এলিমেন্ট সূচকের মতো বা পরিসর পুনরুক্তি জোড়া বাঁধার জন্য মাল্টিম্যাপ ব্যবহার করার সময় বেশ কয়েকটি পরিস্থিতিতে সীমাবদ্ধ থাকে। এবং এটি সাধারণত খুব সীমিত সুযোগে।

হাস্কেল বা পাইথনের মতো কোনও কিছুর সাথে তুলনা করার সময় এটি খুব কুরুচিপূর্ণ এবং হ্যাকি লাগছে। যখন সি ++ 0x এখানে আসে এবং আমরা 'অটো' কীওয়ার্ড টিপলগুলি পাই তখন অনেক বেশি আকর্ষণীয় দেখা শুরু করবে।

টিপলসের কার্যকারিতা এগুলি ঘোষণার জন্য, প্যাক করতে এবং আনপ্যাক করার জন্য প্রয়োজনীয় কীস্ট্রোকের সংখ্যার সাথে বিপরীতভাবে সমানুপাতিক।


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

2
@ জিফ্রে: সমস্যাটি হ'ল হেডার ফাইলের মধ্যে আপনার "নেমস্পেস এক্স" ব্যবহার করা উচিত নয় কারণ এটি নেমস্পেস দূষণকে বাধ্য করে এবং নামস্থানগুলিকে বিভক্ত করে।
মিঃ ফুজ

1
আহ, হ্যাঁ, আমি শিরোনামগুলি ভুলে গেছি। তবে প্রোগ্রাম কোডের অভ্যন্তরে আপনার এটি নিয়ে চিন্তা করার দরকার নেই। এবং একবার আমাদের সি ++ 0 এক্স হয়ে গেলে আমরা অটো ব্যবহার করতে পারি যা টাইপিংয়ের প্রচুর পরিমাণে মুছে ফেলা উচিত।
জিফ্রে

19
এটা শুধু আমার? আমি মনে করি না "বুস্ট ::" এর characters টি অক্ষর টাইপ করে সেটিকেই উল্লেখ করা হয়েছে, তবে অন্যান্য 33 টি অক্ষরকেই উল্লেখ করা হচ্ছে । এটি অনেকগুলি শ্রেণীবদ্ধের টাইপিংয়ের একটি হেক, বিশেষত যদি সেগুলিও নেমস্পেসের মতো হয়। বুস্ট :: টিউপল <std :: স্ট্রিং, std :: সেট <std :: স্ট্রিং>, std :: ভেক্টর <মাই :: স্কোপড :: লংশিপ টাইপনেম>> একটি হাস্যকর উদাহরণ হিসাবে নিন।
ওগ্রে গীতসংহিতা 33

10

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

ব্যক্তিগতভাবে, আমি মনে করি না যে tuples একাধিক মান ফিরিয়ে দেওয়ার এক দুর্দান্ত সমাধান - structএর জন্য একটি কাজের মতো মনে হচ্ছে sounds


4
'আমি কীভাবে "আরও ভাল" পরিবর্তন করতে পারি সে সম্পর্কে আমি সত্যিই ভাবি না - - আমি কোড লিখলে আমি বাগগুলি লিখি। কোডের জটিলতা হ্রাস করে আমি যে বাগগুলি লিখি তা হ্রাস করে। আমি বার বার একই বাগ তৈরি করতে ঘৃণা করি। হ্যাঁ, কীভাবে <স্ট্রাইককে> অদলবদ </> কোডটি আরও ভালভাবে করা যায় সে সম্পর্কে আমি ভাবি । অল্প চলমান যন্ত্রগুলি (এলওসি, টেম্প ভেরিয়েবলস, ভুল টাইপের শনাক্তকারী), আরও পাঠযোগ্য কোড; গুড কোড।
sehe

একমত। স্বতঃ-পয়েন্টার বা একটি স্মার্ট পয়েন্টারে মোড়ানো একটি শ্রেণি টাইপ-সেভ। আমি একবার টিপলস ব্যবহার করেছি, তবে ক্লাস ব্যবহার করে কোডটি আবার লিখেছি। retValue.state retValue.get <0> () এর চেয়ে বেশি পরিষ্কার।
ভ্যালেন্টিন হেইনিজ

1
@ সেহ: আরও ভাল লেখা, আরও পঠনযোগ্য কোডটিও আমার লক্ষ্য। আরও বেশি প্রকারের সিনট্যাক্স যুক্ত করার একটি খরচ রয়েছে এবং আমি বিশ্বাস করি না যে "আরও ভাল অদলবদল" আপনার পড়া প্রতিটি লাইনের কোডের জন্য আরও বেশি প্রকারের সিনট্যাক্স সম্পর্কে চিন্তাভাবনার মানসিক ওভারহেডকে ন্যায্যতা দেয়।
ওজরাক

8

কিন্তু আপনি যদি তিনটি মান ঘোরাতে চান?

swap(a,b);
swap(b,c);  // I knew those permutation theory lectures would come in handy.

ঠিক আছে, তাই 4 টি অন্যান্য মান সহ, শেষ পর্যন্ত এন-টিপল এন -1 অদলবদলের চেয়ে কম কোড হয়ে যায়। এবং ডিফল্ট অদলবদল দ্বারা এটি আপনি নিজের পরিবর্তে 4-টির পরিবর্তে 4 অ্যাসাইনমেন্ট দেয় যদি আপনি নিজেই একটি তিন-চক্র টেম্পলেট প্রয়োগ করেন, যদিও আমি আশা করি যে সংকলকটি সহজ প্রকারের জন্য এটি সমাধান করবে।

আপনি এমন দৃশ্যাবলী নিয়ে আসতে পারেন যেখানে অদলবদল অপ্রয়োজনীয় বা অনুপযুক্ত, উদাহরণস্বরূপ:

tie(a,b,c) = make_tuple(b*c,a*c,a*b);

আনপ্যাক করাটা একটু বিশ্রী।

পয়েন্টটি হ'ল, সর্বাধিক সাধারণ পরিস্থিতিগুলির সাথে মোকাবিলার জ্ঞাত উপায় রয়েছে যা টিউপলস পক্ষে ভাল এবং তাই এইভাবে টিউপসগুলি গ্রহণ করার কোনও মহান জরুরিতা নেই। আর কিছু না হলে আমি আত্মবিশ্বাসী নই:

tie(a,b,c) = make_tuple(b,c,a);

এটি 6 টি অনুলিপি করে না, এটি কিছু প্রকারের জন্য একেবারে অনুপযুক্ত করে তোলে (সংগ্রহগুলি সর্বাধিক সুস্পষ্ট। আমাকে প্ররোচিত করতে নির্দ্বিধায় মনে করুন যে টিপলগুলি "বৃহত" প্রকারের জন্য এটি একটি ভাল ধারণা, এটি না বলে :-)

একাধিক মান প্রত্যাবর্তনের জন্য, মানগুলি অসম্পূর্ণ প্রকারের হলে টিপলগুলি সঠিক, কিছু লোক একাধিক রিটার্ন মান পছন্দ করে না এবং এগুলি আরও সহজ করে তাদের ব্যবহারকে উত্সাহিত করতে চায় না। কিছু লোকেরা কেবলমাত্র বাইরে এবং বাইরে প্যারামিটারের জন্য নামযুক্ত কাঠামো পছন্দ করে এবং সম্ভবত বেসবল ব্যাট দিয়ে টিপলস ব্যবহার করতে রাজি করা যায় না। স্বাদ জন্য কোন অ্যাকাউন্টিং।


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

আপনি কেন টিউপস ব্যবহার করেন তা জানুন (এবং আমি জানি যে অনুষ্ঠানটি যদি উত্থাপিত হয় তবে আমি কেন সেগুলি ব্যবহার করব, যদিও আমি মনে করি না এটি কখনও হয় না)। আমি অনুমান করছি যে অন্য লোকেরা তাদের সচেতন থাকলেও কেন এগুলি ব্যবহার করে না। উদাহরণস্বরূপ যেহেতু তারা "আউট প্যারামগুলি অশুভ" এর সাথে একমত নন ...
স্টিভ জেসপ

আপনি কি জানেন যে আমরা "টাই (এ, বি, সি) = মেক_টুপল (বি, সি, এ) প্রতিস্থাপন করতে পারি কিনা;" "টাই (ক, বি, সি) = টাই (খ, সি, ক);" ?
রেজিক্সার

2
একটি টাই (ভাল, একটি স্তর প্রযুক্তিগতভাবে) অবিচ্ছিন্ন রেফারেন্স সহ তৈরি একটি টুপল। আমি বুস্ট ডকুমেন্টেশন খুঁজে পাচ্ছি না যা বলে যা অপারেটর = এবং টাই / টুপলের জন্য অনুলিপি তৈরির অনুলিপি তৈরি করে যখন কিছু রেফারেন্স জড়িত একই রকম হয় nd তবে এটি আপনার জানা দরকার। অপারেটরের একটি নির্বিকার প্রয়োগ = স্পষ্টতই খুব ভুল হতে পারে ...
স্টিভ জেসপ

1
@ স্টিভ: এবং যেহেতু সম্পর্কগুলি হ'ল অনুলিপিগুলি রোধ করার বিষয়ে (তাদের উচিত নন-অনুলিপিযোগ্য প্রকারের জন্য কাজ করা; নোট করুন যে এলএইচএস সম্পূর্ণরূপে অন্য কিছু হতে পারে) এটি অবশ্যই খুব ভুল হওয়া উচিত (নন-পিওডি শ্রেণীর অবজেক্টগুলির কথা ভাবেন)। ভেবে দেখুন কীভাবে আপনি টেম্পস ব্যবহার না করে একই যুক্তিটি লিখবেন।
sehe

7

অনেক লোক যেমন উল্লেখ করেছে, টিপলগুলি অন্যান্য বৈশিষ্ট্যগুলির মতো ঠিক তেমন কার্যকর নয়।

  1. অদলবদল এবং ঘোরানো গিমিকগুলি কেবল গেমিকস। যারা তাদের আগে দেখেনি তাদের পক্ষে তারা সম্পূর্ণ বিভ্রান্ত করছে, এবং যেহেতু এটি প্রত্যেকেই বেশিরভাগ, তাই এই ছদ্মবেশগুলি কেবলমাত্র সফটওয়্যার ইঞ্জিনিয়ারিং অনুশীলন।

  2. টিপলস ব্যবহার করে একাধিক মান প্রত্যাবর্তন হ'ল স্ব স্ব-ডকুমেন্টিং এর পরে বিকল্পগুলি - নামযুক্ত প্রকারগুলি প্রত্যাবর্তন করা বা নাম উল্লেখ করা হয়। এই স্ব-ডকুমেন্টিং ব্যতীত প্রত্যাবর্তিত মানগুলির ক্রমকে বিভ্রান্ত করা সহজ, যদি তারা পারস্পরিক রূপান্তরিত হয় এবং কোনও জ্ঞানী না হয়।


6

সবাই বুস্ট ব্যবহার করতে পারে না, এবং টিআর 1 এখনও বহুলভাবে উপলভ্য নয়।


3
প্রচুর মানুষ বুস্ট ব্যবহার করে। এই লোকেরা টিপলগুলিও ব্যবহার করতে পারে।
জিফ্রে

3
আপনি জিজ্ঞাসা করেছিলেন কেন লোকেরা সেগুলি ব্যবহার করে না এবং আমি একটি উত্তর দিয়েছি।
ব্রায়ান নিল

2
নিম্ন ভোটারদের কাছে: আমি এমন জায়গায় কাজ করতে গিয়েছি যেখানে বুস্ট ব্যবহার করা রাজনৈতিকভাবে অসম্ভব এবং এই তারিখেও, আমরা যে সংকলক টুল চেইন ব্যবহার করি (এম্বেডেড সিস্টেমের জন্য) সেখানে টিআর 1 / সি ++ 11 সমর্থন নেই।
ব্রায়ান নিল

5

এম্বেড থাকা সিস্টেমে সি ++ ব্যবহার করার সময় বুস্ট লাইব্রেরিগুলিতে টান জটিল হয়ে যায়। তারা একে অপরের সাথে জুড়ি দেয়, তাই লাইব্রেরির আকার বৃদ্ধি পায়। আপনি ডেটা স্ট্রাকচারগুলি ফিরিয়ে দেন বা টিপলসের পরিবর্তে প্যারামিটার পাসিং ব্যবহার করেন। পাইথনে টিপলগুলি ফিরানোর সময় ডেটা স্ট্রাকচারটি সঠিক মান অনুযায়ী সাজানো এবং প্রকারভেদে থাকে values


5

আপনি খুব কমই এগুলি দেখতে পান কারণ ভালভাবে নকশিত কোড সাধারণত তাদের প্রয়োজন হয় না-বন্য অঞ্চলে এমন অনেক ক্ষেত্রেই দেখা যায় না যেখানে একটি বেনামি স্ট্রাক্ট ব্যবহার করা নামযুক্ত ব্যবহারের চেয়ে সেরা। যেহেতু সমস্ত টিপল সত্যই প্রতিনিধিত্ব করে তা একটি বেনাম কাঠামো, বেশিরভাগ পরিস্থিতিতে বেশিরভাগ কোডার কেবল আসল জিনিসটির সাথে চলে।

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

যদি "এফ" ব্যর্থ হতে পারে তবে আপনার স্ট্যাটাস রিটার্ন দরকার all সর্বোপরি, আপনি কলারদের ব্যর্থতা সনাক্ত করতে প্রতিটি পরামিতি পরিদর্শন করতে চান না। "চ" সম্ভবত প্যাটার্নে খাপ খায়:

struct ReturnInts ( int y,z; }
bool f(int x, ReturnInts& vals);

int x = 0;
ReturnInts vals;
if(!f(x, vals)) {
    ..report error..
    ..error handling/return...
}

এটি সুন্দর নয়, তবে বিকল্পটি কতটা কুশ্রী। মনে রাখবেন যে আমার এখনও একটি স্থিতির মান দরকার তবে কোডটি আরও বেশি পঠনযোগ্য এবং খাটো নয়। এটি সম্ভবত খুব ধীরে ধীরে, যেহেতু টিপলের সাথে আমার 1 অনুলিপি ব্যয় হয়।

std::tuple<int, int, bool> f(int x);
int x = 0;
std::tuple<int, int, bool> result = f(x); // or "auto result = f(x)"
if(!result.get<2>()) {
    ... report error, error handling ...
}

আরেকটি, উল্লেখযোগ্য নেতিবাচকতা এখানে লুকিয়ে আছে - "রিটার্নইন্টস" এর সাথে আমি "ফ" এর ইন্টারফেসের পরিবর্তে "রিটার্নইন্টস" পরিবর্তন করে "ফ" এর রিটার্ন যুক্ত করতে পারি। টিউপল সলিউশনটি সেই সমালোচক বৈশিষ্ট্যটি সরবরাহ করে না, যা এটি কোনও লাইব্রেরি কোডের জন্য নিকৃষ্ট উত্তর করে।


1
ব্যতিক্রমগুলি সেই ইন্টারফেসটিকে আরও পরিষ্কার করে তোলে।
ডেভিড স্টোন

সুষ্ঠু হওয়ার জন্য (এবং পার্টিতে চূড়ান্ত দেরি হওয়া) আপনি কোডটি সেট করে using std::tuple;এবং ব্যবহারের মাধ্যমে পঠনযোগ্যতা সহজ করতে পারবেন tuple
অ্যালেকার

2
ব্যবহার tupleকোডটি কম পাঠযোগ্য, আরও বেশি করে তোলে । আজকাল বেশিরভাগ কোডের মধ্যে এটির মধ্যে অনেকগুলি সংখ্যক চিহ্ন রয়েছে - যা দেখে std::tupleতা চোখের সামনে পরিষ্কার হয়ে যায়।
টম সুইরিলি

3

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

যদি আপনার প্রোগ্রামটি ধারাবাহিকভাবে এমন জায়গাগুলি খুঁজে পায় যেখানে আপনাকে একাধিক মানগুলি ফেরত দিতে বা বেশ কয়েকটি মান স্যুপ করতে হয় তবে এটি দ্বিগুণ পথে যেতে পারে তবে অন্যথায় কখনও কখনও ক্লাসিক উপায়ে কাজ করা সহজ।

সাধারণভাবে বলতে গেলে, প্রত্যেকেরই ইতিমধ্যে বুস্ট ইনস্টল নেই, এবং আমি অবশ্যই এটি ডাউনলোড এবং আমার অন্তর্ভুক্ত ডিরেক্টরিগুলি কেবল এর টিউপল সুবিধার জন্য এটির সাথে কাজ করার কনফিগার করার ঝামেলা কাটিয়ে উঠব না। আমি মনে করি আপনি দেখতে পাবেন যে ইতিমধ্যে বুস্ট ব্যবহার করা লোকেরা তাদের প্রোগ্রামগুলিতে নন-বুস্ট ব্যবহারকারীদের তুলনায় টুপল ব্যবহারগুলি বেশি খুঁজে পেতে পারে এবং অন্যান্য ভাষায় আগত অভিবাসীরা (পাইথন মনে আসে) কেবল টিউপসগুলির অভাব সম্পর্কে বিচলিত হওয়ার সম্ভাবনা বেশি থাকে টিপল সমর্থন যুক্ত করার পদ্ধতিগুলি আবিষ্কার করার চেয়ে সি ++ এ।


1

যেহেতু ডেটা স্টোরের std::tuplestructএবং অ্যারে উভয়েরই সবচেয়ে খারাপ বৈশিষ্ট্য রয়েছে ; সমস্ত অ্যাক্সেস নবম অবস্থান ভিত্তিক তবে tupleএকটি forলুপ ব্যবহার করে কেউ পুনরাবৃত্তি করতে পারে না ।

সুতরাং উপাদানগুলির উপাদানটি যদি tupleধারণাগতভাবে একটি অ্যারে হয় তবে আমি একটি অ্যারে ব্যবহার করব এবং উপাদানগুলি ধারণাগতভাবে অ্যারে না হলে একটি কাঠামো (যা উপাদানগুলির নাম দিয়েছে) আরও রক্ষণাবেক্ষণযোগ্য। (এর a.lastnameচেয়ে বেশি ব্যাখ্যাযোগ্য std::get<1>(a))।

এটি টিপলসগুলির একমাত্র কার্যকর ব্যবহারের ক্ষেত্র হিসাবে ওপি দ্বারা উল্লিখিত রূপান্তরটি ছেড়ে দেয়।


0

আমার অনুভূতি আছে যে অনেকেই বুস্ট.টুপলের পরিবর্তে বুস্ট.অনি এবং বুস্ট.ভ্যারেন্ট (কিছু প্রকৌশল সহ) ব্যবহার করেন।


আপনি কেন এমন কিছুর জন্য দক্ষ স্ট্যাটিক টাইপিং বাণিজ্য করবেন?
জিফ্রে

বুস্ট.ভেরিয়েন্ট সম্পূর্ণরূপে নিরাপদ।
ব্যবহারকারী 21714

1
ওফস, হ্যাঁ এটি টাইপসেফ, তবে এটি রানটাইম টাইপ করে।
জিফরে

5
আমি দেখতে পাচ্ছি না যে টুপলকে যে কোনও / বৈকল্পিক প্রতিস্থাপন করা যেতে পারে। তারা একই জিনিস না।
মানকারে

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