मुझे सही अग्रेषण के साथ कुछ कठिनाइयों हैं।बिल्कुल सही अग्रेषण और std :: tuple (या अन्य templated कक्षा)
यहां मेरी समझ का वर्तमान स्तर है: गोंद टेम्पलेट + रावल्यू संदर्भ + std :: आगे और एक विशेष जादुई मोड सक्रिय हो जाता है जहां टेम्पलेट कटौती नियम सामान्य रूप से समान अर्थ नहीं होते हैं, लेकिन पूर्ण अग्रेषण की अनुमति देने के लिए तैयार किए जाते हैं। उदाहरण:
template <typename T>
void outer(T&& t)
{
inner(std::forward<T>(t)); // perfect forwarding activated
}
लेकिन क्या होगा अगर टी वास्तव में एक टेम्प्लेटेड वर्ग है? उदाहरण के लिए, मैं std :: tuple को कैसे पूर्ण कर सकता हूं? यदि टी & & का उपयोग करते हैं तो मैं टुपल में मौजूद वस्तुओं की सभी प्रकार की जानकारी खो दूंगा।
निम्नलिखित कोड काम हालांकि नहीं कर सकते:
template <typename... Args>
void outer(std::tuple<Args...>&& t)
{
inner(std::forward<std::tuple<Args...>>(t));
use_args_types_for_something_else<Args...>(); // I need to have Args available
}
int main()
{
std::tuple<int, double, float> t(4, 5.0, 4.0f);
outer(t);
}
अंतिम जीसीसी स्नैपशॉट का कहना है:
error: cannot bind 'std::tuple<int, double, float> lvalue to
std::tuple<int, double, float>&&
तो स्पष्ट रूप से, हम सामान्य, गैर टेम्पलेट मामले में अभी भी कर रहे हैं जहां lvalue बाँध नहीं कर सकते संदर्भ के लिए rvalue। "परफेक्ट forwading मोड" सक्रिय नहीं है
तो मैं डरपोक हो सकता है और एक टेम्पलेट टेम्पलेट के रूप में मेरी टपल पास करने का प्रयास:
template <
typename... Args
template <typename...> class T
>
void outer(T<Args...>&& t)
{
inner(std::forward<T<Args...>>(t));
use_args_type_for_something_else<Args...>();
}
लेकिन मैं अभी भी एक ही त्रुटि मिलती है।
क्या आप टाइप को निर्दिष्ट किए बिना std :: आगे कॉल नहीं कर सकते हैं (क्योंकि यह टेम्पलेट फ़ंक्शन है और कटौती का उपयोग कर सकता है)? 'std :: आगे (टी)' – SoapBox