क्या सी ++ 11 में decltype
के परिणाम की तुलना करने का कोई तरीका है?decltype तुलना
दूसरे शब्दों में, क्यों इस कोड अमान्य है:
template<typename T, typename U>
void func(T& t, U& u) {
if(decltype(t) == decltype(u)) {
// Some optimised version for this case
} else {
// A more general case for differing types
}
}
मुझे पता है कि कुछ मामलों में इस विशेष समस्या आंशिक टेम्पलेट विशेषज्ञता द्वारा हल किया जा सकता है; मेरा प्रश्न decltype
एस की तुलना के बारे में है।
संपादित करें: प्रश्न SFINAE के माध्यम से नि: शुल्क कार्यों के लिए डिफ़ॉल्ट प्रदान करने के प्रयास में आया था। शायद एक बेहतर सवाल हो गया होता क्यों यह अमान्य है:
template<bool B>
bool SomeFunction() { ... }
template<typename T, typename U>
bool SomeFunctionWrapper(T& t, U& u) {
SomeFunction<decltype(t) == decltype(u)>();
}
मैंने के बाद से एक और समाधान पाया (है कि सभी पर टेम्पलेट्स शामिल नहीं करता है), लेकिन एक स्तर पर मैं इस कोशिश की:
// If it exists, the free function is defined as
// bool AFreeFunction();
typedef struct { char } undefined;
template<typename T = void>
undefined AFreeFunction();
template<bool B>
bool AFreeFunctionWrapper_() {
return false;
}
template<>
bool AFreeFunctionWrapper_<false>() {
return AFreeFunction();
}
bool AFreeFunctionWrapper() {
return AFreeFunctionWrapper_<decltype(AFreeFunction()) == decltype(undefined)>();
}
मुझे अंततः जीसीसी 4.6 के साथ काम करने वाली इस रणनीति का एक रूप मिला, लेकिन फिर पता चला कि 2012 आरसी में भी एमएसवीसी में टेम्पलेट कार्यों के लिए डिफ़ॉल्ट टेम्पलेट तर्कों की अनुमति नहीं है। तो अंतिम समाधान इस तरह दिखता है:
class AFreeFunction {
public:
operator bool() { return false; }
};
यदि फ़ंक्शन परिभाषित किया गया है, तो इसे कॉल किया जाता है। यदि ऐसा नहीं है, तो इसे कक्षा के लिए एक निर्माता के रूप में व्याख्या किया जाता है, जिसे तत्काल bool
पर डाला जाता है।
ध्यान दें कि ऊपर दिए गए मुक्त फ़ंक्शन फॉर्म को आंशिक विशेषज्ञता के साथ हल नहीं किया जा सकता है; इसे अनुमति देने के लिए इसे कक्षा टेम्पलेट के रूप में सुधारने की आवश्यकता है। – Tom
नहीं, इसे कक्षा टेम्पलेट होने की आवश्यकता नहीं है, यह * अधिभारित * फ़ंक्शन टेम्पलेट का एक साधारण सेट हो सकता है। –
@ एनएम। अच्छी बात। – Tom