C++ 11 से पहले का उचित उपयोग, मैं इस तरह कोड लिखने के लिए इस्तेमाल किया:सार्वभौमिक संदर्भ
// Small functions
void doThingsWithA(const A& a)
{
// do stuff
}
void doThingsWithB(const B& b)
{
// do stuff
}
void doThingsWithC(const C& c)
{
// do stuff
}
// Big function
void doThingsWithABC(const A& a, const B& b, const C& c)
{
// do stuff
doThingsWithA(a);
doThingsWithB(b);
doThingsWithC(c);
// do stuff
}
लेकिन अब, इस कदम अर्थ विज्ञान के साथ, यह दिलचस्प (कम से कम कुछ मामलों में) की अनुमति के लिए हो सकता है मेरी कार्यों पैरामीटर के रूप में rvalue संदर्भ लेने के लिए और इन भार के जोड़ने के लिए:
void doThingsWithA(A&& a);
void doThingsWithB(B&& b);
void doThingsWithC(C&& c);
मैं क्या इकट्ठा होते हैं, अगर मैं अपने बड़े समारोह के भीतर उन भार के कॉल करने के लिए सक्षम होना चाहते हैं से, मैं की तरह लग रहे हो सकता है जो सही अग्रेषण का उपयोग करने की जरूरत है, यह (यह थोड़ा कम पठनीय है, लेकिन मुझे लगता है कि यह एक अच्छा नामकरण संयोजन के साथ ठीक हो सकता है टेम्पलेट प्रकार के लिए tion):
template<typename TplA, typename TplB, typename TplC>
void doThingsWithABC(TplA&& a, TplB&& b, TplC&& c)
{
// do stuff
doThingsWithA(std::forward<TplA>(a));
doThingsWithB(std::forward<TplB>(b));
doThingsWithC(std::forward<TplC>(c));
// do stuff
}
मेरे समस्या यह है: कि इसका मतलब यह नहीं है कि अगर मेरे छोटे कार्यों अन्य भार के है, यह है जिसके लिए वह था प्रकार के मानकों के साथ बड़ा एक कॉल करने के लिए संभव हो जाएगा इरादतन नही?
मुझे लगता है कि यह इसे रोकने के लिए काम कर सकते हैं:
template<typename TplA, typename TplB, typename TplC,
class = typename std::enable_if<std::is_same<A, std::decay<TplA>::type>::value>::type,
class = typename std::enable_if<std::is_same<B, std::decay<TplB>::type>::value>::type,
class = typename std::enable_if<std::is_same<C, std::decay<TplC>::type>::value>::type>
doThingsWithABC(TplA&& a, TplB&& b, TplC&& c)
{
// do stuff
doThingsWithA(std::forward<TplA>(a));
doThingsWithB(std::forward<TplB>(b));
doThingsWithC(std::forward<TplC>(c));
// do stuff
}
हालांकि मुझे यकीन है कि अगर यह बहुत प्रतिबंधक नहीं है, के रूप में मैं इसे कैसे बर्ताव का पता नहीं है अगर मैं बड़ा कार्यों कॉल करने के लिए कोशिश नहीं कर रहा हूँ उन प्रकारों के साथ जो ए, बी या सी के लिए निहित रूप से परिवर्तनीय हैं ...
लेकिन ... यहां तक कि इस काम का अनुमान लगाते हुए, क्या मेरे पास वास्तव में कोई अन्य विकल्प नहीं है? (मेरा मतलब है ... आंखों पर यह आसान नहीं है)
यदि आप अपनी आंखों पर आसान हैं तो आप 'static_assert' का उपयोग कर सकते हैं। –
आप 'doThingsWithABC' के सभी 8 संस्करणों को उत्पन्न करने के लिए मैक्रो का उपयोग कर सकते हैं ... * बतख * – Brian