আপনি যদি না কেবল f
ফাংশন সদস্য রয়েছে এমন সমস্ত প্রকারের জন্য একটি ফাংশন কল করতে সক্ষম হতে চান তবে আপনি ফাংশনের জন্য ২ টি ওভারলোড ঘোষণা করতে পারেন :getInt
X
f
getInt
শ্রেণীর সহ সদস্য ফাংশন রয়েছে এমন ধরণের জন্যX
ক্লাস সহ অন্যান্য সমস্ত ধরণের জন্য Y
।
সি ++ 11 / সি ++ 17 সমাধান
এটি মনে রেখে আপনি এই জাতীয় কিছু করতে পারেন:
#include <iostream>
#include <type_traits>
template <typename, typename = void>
struct has_getInt : std::false_type {};
template <typename T>
struct has_getInt<T, std::void_t<decltype(((T*)nullptr)->getInt())>> : std::is_convertible<decltype(((T*)nullptr)->getInt()), int>
{};
class X {
public:
int getInt(){
return 9;
}
};
class Y {};
template <typename T,
typename std::enable_if<!has_getInt<T>::value, T>::type* = nullptr>
void f(T& v) {
// only for Y
std::cout << "Y" << std::endl;
}
template <typename T,
typename std::enable_if<has_getInt<T>::value, T>::type* = nullptr>
void f(T& v){
// only for X
int i = v.getInt();
std::cout << "X" << std::endl;
}
int main() {
X x;
f(x);
Y y;
f(y);
}
এটি সরাসরি দেখুন ।
দয়া করে নোট করুন যেটি std::void_t
সি ++ 17 এ প্রবর্তিত হয়েছে, তবে আপনি যদি সি ++ 11 এর মধ্যে সীমাবদ্ধ থাকেন তবে void_t
আপনার নিজের থেকে বাস্তবায়ন করা সত্যিই সহজ :
template <typename...>
using void_t = void;
এবং এখানে সি ++ 11 সংস্করণ লাইভ ।
আমাদের C ++ 20 এ কী আছে?
সি ++ ২০ টি প্রচুর ভাল জিনিস নিয়ে আসে এবং এর মধ্যে একটি ধারণা । C ++ 11 / C ++ 14 / C ++ 17 এর জন্য বৈধ যে জিনিসটি সি ++ 20 তে উল্লেখযোগ্যভাবে হ্রাস করা যেতে পারে:
#include <iostream>
#include <concepts>
template<typename T>
concept HasGetInt = requires (T& v) { { v.getInt() } -> std::convertible_to<int>; };
class X {
public:
int getInt(){
return 9;
}
};
class Y {};
template <typename T>
void f(T& v) {
// only for Y
std::cout << "Y" << std::endl;
}
template <HasGetInt T>
void f(T& v){
// only for X
int i = v.getInt();
std::cout << "X" << std::endl;
}
int main() {
X x;
f(x);
Y y;
f(y);
}
এটি সরাসরি দেখুন ।
type_info
কাঠামোর একটি সমতা তুলনা অপারেটর রয়েছে , তাইtypeid(T) == typeid(X)
পাশাপাশি কাজ করা উচিত।