मुझे एक समस्या है जहां मैं एक फ़ंक्शन foo
का एक सामान्य संस्करण प्रदान करना चाहता हूं जो केवल तब लागू हो सकता है जब किसी आमंत्रण के लिए बिल्कुल कोई अन्य मिलान न हो। मैं निम्नलिखित कोड को कैसे संशोधित कर सकता हूं जैसे last_resort::foo
derived::type
base::foo
से अधिक खराब मिलान है? मैं एक समाधान खोजना चाहता हूं जिसमें bar
की परिभाषा को संशोधित करने में शामिल नहीं है और जो last_resort::foo
के तर्क के प्रकार को संरक्षित रखेगा।एडीएल के दौरान फ़ंक्शन टेम्पलेट को कम से कम प्राथमिकता कैसे बनाएं?
#include <iostream>
namespace last_resort
{
template<typename T> void foo(T)
{
std::cout << "last_resort::foo" << std::endl;
}
}
template<typename T> void bar(T)
{
using last_resort::foo;
foo(T());
}
namespace unrelated
{
struct type {};
}
namespace base
{
struct type {};
void foo(type)
{
std::cout << "base::foo" << std::endl;
}
}
namespace derived
{
struct type : base::type {};
}
int main()
{
bar(unrelated::type()); // calls last_resort::foo
bar(base::type()); // calls base::foo
bar(derived::type()); // should call base::foo, but calls last_resort::foo instead
return 0;
}
यह सच है, लेकिन मुझे आश्चर्य है कि क्या डिफ़ॉल्ट मूल्यों के साथ कुछ अतिरिक्त पैरामीटर के साथ इसे बढ़ाकर foo में "छुपा" रूपांतरण शुरू करने का कोई तरीका है? –
मुझे नहीं लगता कि यह काम करेगा। जो मैं कह सकता हूं उससे "सर्वश्रेष्ठ" आप एक अस्पष्टता प्राप्त कर सकते हैं ताकि संकलन विफल हो जाए। लेकिन शायद, मैं कुछ भी याद कर रहा हूँ। – sellibitze
यह समाधान '' 'last_resort :: foo''' के रिटर्न प्रकार को' '' disabled_if_foo_exists :: टाइप''' के साथ सजाने के लिए प्रतीत होता है, जो एक मुफ्त '' 'foo की जांच करने के लिए SFINAE का उपयोग करेगा '' 'समारोह यदि कोई मौजूद है, तो '' 'last_resort :: foo''' ओवरलोड सेट से हटा दिया जाएगा। –