2012-11-25 27 views
13

मैं Google पर इस पर एक जवाब खोजने की कोशिश कर रहा हूं, लेकिन मुझे सही शर्तों से नहीं खोजना चाहिए क्योंकि मुझे इस व्यवहार के बारे में कोई भी बात नहीं मिल रही है। मैं यह पता लगाने की कोशिश कर रहा हूं कि टेम्पलेट किए गए कार्यों का आंशिक विनिर्देश सी ++ मानक का हिस्सा है, या यह कुछ संकलक विशिष्ट है या नहीं।सी ++ कार्यों में आंशिक टेम्पलेट फ़ंक्शन विनिर्देश, लेकिन क्यों?

आंशिक विनिर्देशन से, मेरा मतलब है कि संकलक केवल कटौती नहीं कर सकते हैं।

#include <iostream> 
#include <tuple> 
#include <string> 

template<class A, class B, class C> 
std::tuple<A, B> test(C c) 
{ 
    // do something based on c, return tuple with types A and B 
    return std::make_tuple(A(), B()); 
} 

int main(void) 
{ 
    // I expected I would have to use this form. Specify all parameters. 
    std::tuple<int, int> value3 = test<int, int, int>(5); 

    // Here, I only specified the return value types, did not specify the parameter type, yet it compiles. 
    auto value1 = test<int, int>("c-string"); 

    // Similar example here. Return types specified, parameter type deduced. Compiles fine. 
    auto value2 = test<std::string, int>(42); 

    return 0; 
} 
: तो अगर मैं एक टेम्पलेट समारोह 'म' है कि 3 प्रकार लेता है, और एक एक पैरामीटर में प्रयोग किया जाता है और निष्कर्ष निकाला जा सकता है, मैं प्रपत्र f<type, type>(parameter)

यहाँ के साथ 'एफ' कॉल कर सकते हैं एक उदाहरण है

मैंने इसका परीक्षण जी ++ 4.5.3, जी ++ 4.6.3, वीएस -2010 और वीएस2012 के साथ किया है। चूंकि इसे कंपेलरों द्वारा व्यापक रूप से समर्थित माना जाता है, इसलिए मैं शर्त लगा रहा हूं कि यह मानक का हिस्सा है, लेकिन क्या कोई इसकी पुष्टि कर सकता है? क्या किसी के पास संसाधनों के लिए कोई लिंक या पॉइंटर्स हैं जो यह समझा सकता है कि यह क्यों काम करता है?

धन्यवाद

+0

आपने समझाया नहीं है कि आपको क्यों लगता है कि यह काम नहीं करना चाहिए। यहां वास्तव में कोई सवाल नहीं है। वैसे भी, आप तर्क कटौती के बारे में बात कर रहे हैं, जो निश्चित रूप से नया नहीं है। –

+0

ऐसा लगता है कि आप इसकी तलाश में हैं: http://cpp0x.centaur.ath.cx/temp.deduct.call.html – yonilevy

+0

हाँ, यह बिल्कुल योनिलीवी है। धन्यवाद। –

उत्तर

14

पैरा सी ++ 03 मानक राज्यों

"टेम्पलेट तर्क है कि निष्कर्ष निकाला जा सकता है (14.8.2) से पीछे चल स्पष्ट टेम्पलेट तर्कों की सूची से हटाया जा सकता है की 14.8.1.2 । "

+0

यह वह पुष्टिकरण है जिसे मैं ढूंढ रहा था, धन्यवाद। –

+0

इस समस्या में मोड़ जोड़ने के लिए: क्या तर्क सूची के मध्य में टेम्पलेट तर्कों को कम करने का कोई तरीका नहीं है, यदि वे * पिछले तर्कों से * हटाए जा सकते हैं, लेकिन बाद के तर्कों को स्पष्ट रूप से निर्दिष्ट किया जाना चाहिए? – haelix

+0

मेरा मतलब है कि ओपी के कोड की तरह ही, लेकिन अगर फ़ंक्शन को 'टेम्पलेट <क्लास ए, क्लास सी, क्लास बी> std :: tuple टेस्ट (सी सी)' के रूप में घोषित किया गया है - शायद 'test (3.14) ' – haelix