আমি বুঝতে কিভাবে ব্যবহার করতে কাজ করার জন্য একটি সহজ উদাহরণ পেতে চেষ্টা করছি std::enable_if
। আমি এই উত্তরটি পড়ার পরে , আমি ভেবেছিলাম একটি সহজ উদাহরণ নিয়ে আসা খুব কঠিন হওয়া উচিত নয়। আমি std::enable_if
দুটি সদস্য-ফাংশনের মধ্যে বেছে নিতে ব্যবহার করতে চাই এবং তাদের মধ্যে কেবল একটিরই ব্যবহার করার অনুমতি দেব।
দুর্ভাগ্যক্রমে, নিম্নলিখিতটি জিসিসি 4.7 দিয়ে সংকলন করে না এবং ঘন্টার পর ঘন্টা চেষ্টা করার পরে আমি আপনাকে বলছি যে আমার ভুলটি কী।
#include <utility>
#include <iostream>
template< class T >
class Y {
public:
template < typename = typename std::enable_if< true >::type >
T foo() {
return 10;
}
template < typename = typename std::enable_if< false >::type >
T foo() {
return 10;
}
};
int main() {
Y< double > y;
std::cout << y.foo() << std::endl;
}
জিসিসি নিম্নলিখিত সমস্যাগুলি প্রতিবেদন করে:
% LANG=C make CXXFLAGS="-std=c++0x" enable_if
g++ -std=c++0x enable_if.cpp -o enable_if
enable_if.cpp:12:65: error: `type' in `struct std::enable_if<false>' does not name a type
enable_if.cpp:13:15: error: `template<class T> template<class> T Y::foo()' cannot be overloaded
enable_if.cpp:9:15: error: with `template<class T> template<class> T Y::foo()'
জি ++ দ্বিতীয় সদস্য ফাংশনের জন্য ভুল ইনস্ট্যান্টেশন কেন মুছে দেয় না? মান অনুসারে, std::enable_if< bool, T = void >::type
বুলিয়ান টেম্পলেট প্যারামিটারটি সত্য হলেই বিদ্যমান। তবে জি ++ এটিকে SFINAE হিসাবে বিবেচনা করবেন না কেন? আমি মনে করি যে ওভারলোডিং ত্রুটি বার্তাটি এমন সমস্যা থেকে আসে যে g ++ দ্বিতীয় সদস্য ফাংশনটি মুছে না এবং বিশ্বাস করে যে এটি একটি ওভারলোড হওয়া উচিত।
std::is_same< T, int >::value
এবং ! std::is_same< T, int >::value
যা একই ফলাফল দেয়।