আমি আধুনিক টেমপ্লেট প্রোগ্রামিং ( পর্ব প্রথম , দ্বিতীয় খণ্ড ) সম্পর্কে সিপ্পকন 14 এ ওয়াল্টার ব্রাউনয়ের বক্তব্যটি দেখেছি যেখানে তিনি তার void_t
এসফিনএই কৌশলটি উপস্থাপন করেছেন ।
উদাহরণ:
একটি সাধারণ ভেরিয়েবল টেম্পলেট দেওয়া হয়েছে যা মূল্যায়ন করে void
যে সমস্ত টেম্পলেট আর্গুমেন্ট ভালভাবে গঠন করা হয়েছে:
template< class ... > using void_t = void;
এবং নিম্নলিখিত বৈশিষ্ট্য যা সদস্য নামে পরিচিত সদস্যের অস্তিত্বের জন্য যাচাই করে :
template< class , class = void >
struct has_member : std::false_type
{ };
// specialized as has_member< T , void > or discarded (sfinae)
template< class T >
struct has_member< T , void_t< decltype( T::member ) > > : std::true_type
{ };
কেন এবং কীভাবে এটি কাজ করে তা বোঝার চেষ্টা করেছি। অতএব একটি ছোট উদাহরণ:
class A {
public:
int member;
};
class B {
};
static_assert( has_member< A >::value , "A" );
static_assert( has_member< B >::value , "B" );
1। has_member< A >
has_member< A , void_t< decltype( A::member ) > >
A::member
বিদ্যমানdecltype( A::member )
সুগঠিতvoid_t<>
বৈধ এবং মূল্যায়নvoid
has_member< A , void >
এবং তাই এটি বিশেষায়িত টেম্পলেট চয়ন করেhas_member< T , void >
এবং মূল্যায়নtrue_type
2। has_member< B >
has_member< B , void_t< decltype( B::member ) > >
B::member
এটির অস্তিত্ব নেইdecltype( B::member )
অসুস্থ এবং নিঃশব্দে ব্যর্থ (sfinae)has_member< B , expression-sfinae >
সুতরাং এই টেমপ্লেটটি বাতিল করা হয়েছে
- সংকলকটি
has_member< B , class = void >
ডিফল্ট আর্গুমেন্ট হিসাবে শূন্যের সাথে খুঁজে পায় has_member< B >
মূল্যায়নfalse_type
প্রশ্নগুলি:
1. এই সম্পর্কে আমার বোঝা কি সঠিক?
২. ওয়াল্টার ব্রাউন বলেছেন যে ডিফল্ট আর্গুমেন্টটি এটির void_t
কাজ করতে ব্যবহৃত হিসাবে ঠিক একই ধরণের হতে হবে। কেন এমন? (আমি দেখতে পাচ্ছি না কেন এই ধরণেরগুলি মেলানো দরকার, কেবল কোনও ডিফল্ট ধরণের কাজটি করে না?)
has_member< T , class = void >
ডিফল্ট করার প্রয়োজন দেখছি না void
। এই বৈশিষ্ট্যটি ধরে নিলাম যে কোনও সময়ে কেবল 1 টি টেমপ্লেট আর্গুমেন্টের সাথে ব্যবহৃত হবে, তবে ডিফল্ট আর্গুমেন্টটি কোনও ধরণের হতে পারে?
template <class, class = void>
হয়েছে template <class, class = void_t<>>
। সুতরাং এখন আমরা void_t
ওরফে টেমপ্লেট প্রয়োগের সাথে যা কিছু করতে চাই তা করতে
has_member<A,int>::value
। তারপরে, আংশিক বিশেষায়নের সাথে যা মূল্যায়ন করেhas_member<A,void>
তা মেলে না। অতএব, এটিhas_member<A,void>::value
সিনট্যাকটিক চিনির সাথে হওয়া উচিত , টাইপের একটি ডিফল্ট যুক্তিvoid
।