টেমপ্লেট ডিফল্ট আর্গুমেন্ট


151

যদি আমাকে নিম্নলিখিতগুলি করার অনুমতি দেওয়া হয়:

template <typename T = int>
class Foo{
};

আমাকে মূলত নিম্নলিখিতগুলি করার অনুমতি দেওয়া হচ্ছে না কেন?

Foo me;

তবে আমাকে অবশ্যই নিম্নলিখিতটি উল্লেখ করতে হবে:

Foo<int> me;

সি ++ 11 প্রবর্তিত ডিফল্ট টেম্পলেট আর্গুমেন্টগুলি এবং এখনই তারা আমার সম্পূর্ণ বোঝার জন্য অধরা হয়ে উঠছে।

উত্তর:


188

তোমাকে করতে হবে:

Foo<> me;

টেমপ্লেট আর্গুমেন্ট অবশ্যই উপস্থিত থাকতে হবে তবে আপনি এগুলি খালি রাখতে পারেন।

এটি fooএকটি একক ডিফল্ট যুক্তিযুক্ত কোনও ফাংশনের মতো ভাবেন Think অভিব্যক্তি fooএটিকে ডাকবে না, তবে foo()করবে। আর্গুমেন্ট সিনট্যাক্স অবশ্যই থাকা উচিত। এটি তার সাথে সামঞ্জস্যপূর্ণ।


4
@Pubby আমি এটা কিছু অপ্রয়োজনীয় জটিলতা তৈরি করবে যদি মনে Foo হতে পারে একটি টেমপ্লেট শনাক্তকারী হতে পারে অথবা পারে একটি সুনির্দিষ্ট ইনস্ট্যান্স আছে কিনা একটি ডিফল্ট যুক্তি উপর নির্ভর করে করা। সুস্পষ্ট ইনস্ট্যান্টেশন সিনট্যাক্স রাখা ভাল। এটি fooএকটি একক ডিফল্ট প্যারামিটার সহ কোনও ফাংশনের মতো ভাবেন । আপনি এটিকে কল করতে পারবেন না foo, আপনি এটি দিয়ে কল করুন foo()। এটি ধারাবাহিক রাখা অর্থবোধ করে।
জোসেফ ম্যানসফিল্ড

2
@ স্পট্রাবিট তবে আপনি কোনও ফাংশন কল করতে পারবেন না এর মতো কোন যুক্তি ছাড়াই foo; আপনি কোনও যুক্তি ছাড়াই ক্লাসের নাম রাখতে পারেন Foo
শেঠ কার্নেগি

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

21
@ ওলাফডিয়েটসে কিন্তু আপনার একই নামের টেম্পলেট শ্রেণি এবং একটি নন-টেম্পলেট শ্রেণি থাকতে পারে না, তাই সংকলকটির নামটি কী তা দেখে কেবল সিদ্ধান্ত নেওয়া উচিত।
শেঠ কার্নেগি

7
@ পাব্বি স্ট্যান্ডার্ড কমিটি তাদের নিজেদের জিজ্ঞাসা করেছিল, আমার ধারণা। এখন, সি ++ 17 এর সাথে <>এই ক্ষেত্রে আর দরকার নেই। আরও তথ্যের জন্য আমার উত্তর দেখুন।
পাওলো এম

53

সি ++ 17 দিয়ে আপনি সত্যই পারেন।

এই বৈশিষ্ট্যটিকে শ্রেণীর টেম্পলেট আর্গুমেন্ট ছাড়ের নাম বলা হয় এবং আপনি টেম্পলেটযুক্ত ধরণের ভেরিয়েবলগুলি যেভাবে ঘোষণা করতে পারেন তাতে আরও নমনীয়তা যুক্ত করুন

সুতরাং,

template <typename T = int>
class Foo{};

int main() {
    Foo f;
}

এখন আইনী সি ++ কোড


5
স্ট্রেঞ্জ। এটি কেবলমাত্র আমার সি ++ 17 প্রকল্পে চেষ্টা করেছি এবং এটি কার্যকর হয়নি: "টেমপ্লেট স্থানধারক টাইপ 'কনস্ট মাইটাইপ' অবশ্যই একটি সাধারণ ঘোষক-আইডি অনুসরণ করা উচিত"। আমি জিসিসি 7.3.0 ব্যবহার করছি।
সিলিকোমান্সার

1
@ সিলিকোমেন্সার আপনার কোড এবং কমান্ড লাইনটি না দেখে বলা শক্ত ... সম্ভবত আপনি এখানে পয়েন্টার নিয়ে কাজ করছেন ?
পাওলো এম

1
ঝনঝনানি কি মনে হয় না? coliru.stacked-crooked.com/a/c5d3c0f90ed263c2
বোরগ্লেডার

1
স্পষ্টত, কলিগ 5.0 ঝাঁকুনি ব্যবহার করছে @ দ্বারা বিচার করা যায় এই , এটা সি ++ 17 টেমপ্লেট যুক্তি সিদ্ধান্তগ্রহণ সমর্থন করা উচিত, কিন্তু স্পষ্ট আইডি না। আপনি যদি ক্ল্যান্ড 7.০ ব্যবহার করে ভ্যান্ডবক্সে আপনার একই উদাহরণ ব্যবহার করেন তবে এটি নির্দোষভাবে কাজ করে।
পাওলো এম

2
@ পাওলোম ওহ দুর্দান্ত, এর ঠিক একটি সংকলক সংস্করণ ইস্যু জেনে খুশি। এটি দেখার জন্য ধন্যবাদ।
বোরগ্লেডার

19

আপনাকে এটি করার অনুমতি দেওয়া হয়নি তবে আপনি এটি করতে পারেন

typedef Foo<> Fooo;

এবং তারপর না

Fooo me;

ডিফল্ট টাইপ এবং: এর সাথে কোনও ডিফল্ট টাইপ typedef Foo<float> Fooo;ছাড়া কোনও পার্থক্য আছে কি?
কেরিকো

5
সি ++ 11-ইশ উপায় বলতে হবেusing Fooo = Foo<>;
অ্যাড্রিয়ান ডাব্লু

18

আপনি নিম্নলিখিত ব্যবহার করতে পারেন:

Foo<> me;

এবং intআপনার টেম্পলেট যুক্তি হতে হবে। কৌণিক বন্ধনী প্রয়োজনীয় এবং বাদ দেওয়া যায় না।


বোঝায় এবং আপনাকে ধন্যবাদ জানায় তবে নীচে উল্লিখিত হিসাবে, ধরণের নির্দিষ্টকরণগুলি কেন উপস্থিত রয়েছে?
ব্যবহারকারীর 633658

@ ব্যবহারকারী 633658: আপনি কি "টাইপ স্পেসিফায়ার" বলতে চান? আমি নিশ্চিত যে আমি বুঝতে পেরেছি না
অ্যান্ডি প্রোল

যাইহোক, খালি কৌণিক বন্ধনী প্রয়োজনের পিছনে কারণ সম্পর্কে, আমি কেবল অনুমান করতে পারি, এবং এগুলি কেবলমাত্র টেমপ্লেটের নাম ব্যবহার করে সম্ভাব্য অস্পষ্টতাগুলি বাতিল করার বিষয়ে, তবে আমাকে স্বীকার করতে হবে যে আমি সঠিকটি জানি না I কারণ
অ্যান্ডি প্রল

আমি দৃ strongly়ভাবে সন্দেহ করি << এর প্রয়োজনীয়তাটি হ'ল সংক্ষেপকারীর পার্সারকে এটি নির্ধারণ করতে সক্ষম করুন যে আপনি foo নামে পরিচিত অন্য কোনও কিছু না করে আপনি foo নামে একটি টেম্প্লেটেড ক্লাসের কথা উল্লেখ করছেন।
ম্যাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.