पर आधारित उचित प्रति-कन्स्ट्रक्टर का चयन करना मैं टेम्पलेट तर्क मान के आधार पर किसी सदस्य फ़ंक्शन (कॉपी कन्स्ट्रक्टर) के कार्यान्वयन का चयन करना चाहता हूं। मुझे लगता है कि दो दृष्टिकोण हैं: SFINAE और टेम्पलेट आंशिक विशेषज्ञता।टेम्पलेट पैरामीटर
पिछले एक माना जाता है कि इस तरह दिखता है:
#include <iostream>
template<typename A, bool sw>
struct B
{
B() {}
B(const B &b);
};
template<typename A>
B<A, false>::B(const B<A, false> &b)
{
std::cout << "false\n";
}
template<typename A>
B<A, true>::B(const B<A, true> &b)
{
std::cout << "true\n";
}
int main()
{
}
यह संकलन नहीं करता है: nested name specifier 'B<A, false>::' for declaration does not refer into a class, class template or class template partial specialization
।
SFINAE दृष्टिकोण भी विफल रहता है:
#include <type_traits>
#include <iostream>
template<typename A, bool sw>
struct B
{
B() {}
template<typename U = typename std::enable_if<sw, B>::type>
B(const U &b)
{
std::cout << "true\n";
}
template<typename U = typename std::enable_if<!sw, B>::type>
B(const U &b)
{
std::cout << "false\n";
}
};
int main()
{
{
B<int, true> b;
auto bc = b; // cout << true
}
{
B<int, false> b;
auto bc = b; // cout << false
}
}
संकलन त्रुटि यहाँ constructor cannot be redeclared
और no type named 'type' in 'std::enable_if<false, B<int, false> >'; 'enable_if' cannot be used to disable this declaration
है।
क्या समस्याएं ठीक करने या अन्यथा टेम्पलेट पैरामीटर के आधार पर उपयुक्त प्रति-निर्माता का चयन करने का कोई तरीका है?
आप आंशिक विशेषज्ञता एक वर्ग (या संरचना) का सिर्फ सदस्यों पर नहीं कर सकते , आपको आंशिक रूप से पूर्ण वर्ग का विशेषज्ञ होना चाहिए। रिकॉर्ड के लिए –
, यहां की समस्याओं में से एक यह है कि आपके पास एक टेम्पलेट कॉपी-कन्स्ट्रक्टर नहीं हो सकता है (इस तथ्य को छोड़कर कि आपके हस्ताक्षर में दो हस्ताक्षर समान हैं, इसे ठीक किया जा सकता है), क्योंकि एक पूर्ण रूप से जेनरेट की गई प्रति- कन्स्ट्रक्टर हमेशा अधिभार संकल्प में जीतता है –