2011-06-09 38 views
5

, तब हम निम्नलिखित है:बिल्कुल सही अग्रेषण

template <class T> 
struct B{ 
    T data; 
} 

struct A{ 
    int data_array[100]; 
} 

int main() 
{ 
    A x; 
    const A x_const; 

    auto y1 = f(A()); 
    auto y2 = f(x); 
    auto y3 = f(x_const); 
    auto y4 = f(std::move(x)); 
} 

मैं एक f जानना चाहते हैं (अधिमानतः समारोह, लेकिन मैक्रो भी ठीक है) ऐसी है कि:

decltype(y1) == B<A> 
decltype(y2) == B<A&> 
decltype(y3) == B<const A&> 
decltype(y4) == B<A&&> 

है, f पूरी तरह से आगे B की एक वस्तु में।

+3

[क्या करें?] (Http://www.catb.org/esr/faqs/smart-questions.html#goal) – GManNickG

+0

आप अंतिम उपाय के रूप में फ़ंक्शन अधिभार चुन सकते हैं। :) – iammilind

उत्तर

3
template <typename T> 
auto f(T&& t) -> B<decltype(std::forward<T>(t))> 
{ 
    return B<decltype(std::forward<T>(t))>{std::forward<T>(t)}; 
} 

यह करता है लगभग आप क्या चाहते हैं। केवल एक ही अंतर यह है कि के बजाय टाइप B<A&&> है।

8

यह असंभव है। y1 और y4 के लिए, तो वे दोनों प्रकार ए के रावल लेते हैं, लेकिन आप उन्हें विभिन्न प्रकारों को वापस करना चाहते हैं। f को कैसे पता होना चाहिए कि वापस क्या करना है?

+1

खैर, 'decltype (ए())' '' 'है लेकिन' decltype (std :: move (ए())) '' ए &&' है, इसलिए कुछ अंतर है। – HighCommander4

+2

@ हाईकॉमैंडर 4: वे दोनों रावल हैं। कोई संदर्भ या अन्य भाषा निर्माण नहीं है जो ए और एक अनाम ए && के बीच भेदभाव कर सकता है - वास्तव में, यह आधा बिंदु है जिसे आप नहीं कर सकते हैं। – Puppy

+5

@ हाई कॉमांडर 4 प्रश्न में अंतर यह है कि एक एक प्रवाल है और दूसरा एक xvalue है। चूंकि तर्क गुजरने से केवल अंतराल और रावलों के बीच भेदभाव की अनुमति मिलती है, इसलिए फ़ंक्शन के अंदर अंतर का पता लगाना वास्तव में असंभव है (और यह डिज़ाइन द्वारा है)। –

2
auto y1 = f(A()); 
auto y4 = f(std::move(x)); 

अलग पहचाना नहीं होगा, के रूप में A() एक अस्थायी जो A&& करने के लिए बाध्य होगा उत्पादन।

संबंधित मुद्दे