2014-06-20 20 views
6

मैं की तरह एक variadic कार्य हो aliasing:एक variadic टेम्पलेट समारोह

void test(int){} 

template<typename T,typename...Args> 
void test(int& sum,T v,Args... args) 
{ 
    sum+=v; 
    test(sum,args...); 
} 

मैं की तरह कुछ करने के लिए इसे अन्य नाम पर हैं:

auto sum = test;//error : can not deduce auto from test 
int main() 
{ 
    int res=0; 
    test(res,4,7); 
    std::cout<<res; 
} 

मैं std::bind का उपयोग कर की कोशिश की लेकिन यह variadic साथ काम नहीं करता कार्य क्योंकि इसे प्लेसहोल्डर्स की आवश्यकता है ...

क्या यह एक भिन्न कार्य को उपनाम करना संभव है?

+3

'ऑटो योग = [] (ऑटो && ... पीपी) {वापसी परीक्षण (एसटीडी आगे :: (पीपी) ...); }; 'या ऐसा कुछ। यह एक असली उपनाम नहीं है, हालांकि; उदाहरण के लिए, आप 'auto x = और sum ;' का उपयोग नहीं कर सकते। – dyp

उत्तर

1

आप क्या प्रयास कर रहे हैं संकलक पता लगाने के लिए जो ओवरलोड आप उपयोग करना चाहते के लिए कोई तरीका नहीं है से

void test(int) 
{ 
} 

void test(double, int) 
{ 
} 

auto a = test; 

बहुत अलग नहीं है।

जिसके बारे में test आप द्वारा a को असाइन करना चाहते आप स्पष्ट हो सकता है:

auto a = (void(*)(int))test; 

आप मिश्रण करने के लिए variadic टेम्पलेट संस्करण जोड़ना चाहते हैं, तो आप उपयोग कर सकते हैं:

template<typename T,typename...Args> 
void test(int& sum,T v,Args... args) 
{ 
    sum+=v; 
    test(sum,args...); 
} 

auto a = test<int, int, int>; 
+0

इस मामले के लिए बीटीडब्ल्यू, अगर वह 'टेस्ट (डबल, इंट)' चाहता था, तो वह ऐसा कर सकता था: http://ideone.com/KFJnjh – yizzlez

+0

मुझे पता है कि, मैं विविधतापूर्ण कार्य को बदलने के लिए एक रास्ता तलाश रहा था। @dyp समाधान gcc 4.9, http: //coliru.stacked-crooked.com/a/d3aabbd801efe463 – Omid

+0

के साथ काम करना प्रतीत होता है यह सवाल का जवाब नहीं दे रहा है। बीटीडब्ल्यू 'ऑटो ए = टेस्ट ; 'काम नहीं करता : http://coliru.stacked-crooked.com/a/4c19105de2b3d597 – Omid

0

यह अलियासिंग नहीं है। auto a = test एक वैरिएबल को उसी प्रकार के साथ घोषित करने का प्रयास करता है जैसे test और उन्हें बराबर बनाते हैं। चूंकि परीक्षण एक ही फ़ंक्शन नहीं है, लेकिन फ़ंक्शन टेम्पलेट (और उसके शीर्ष पर आप फ़ंक्शन ओवरलोड भी कर सकते हैं), कंपाइलर यह तय नहीं कर सकता कि किस प्रकार का होना चाहिए।

किसी टेम्पलेट को उपनाम करने के लिए, या वास्तव में किसी भी प्रतीक के रूप में, आप using कीवर्ड का उपयोग कर सकते हैं।

using a = test; 

संपादित करें: क्षमा करें यह केवल कामों के लिए काम नहीं करता है।

+0

यह काम नहीं करता है: http://ideone.com/xJccNe – yizzlez

+0

आप टेम्पलेट फ़ंक्शन का उपयोग करने के साथ उपनाम नहीं कर सकते हैं! – Omid

+0

हाँ, मेरे बुरे, आप हालांकि एक मजेदार उपनाम कर सकते हैं। वैसे तो यह वर्तमान में सी ++ में असंभव है। –

4

सी ++ 1 वर्ष में:

#include <iostream> 

void test(int){} 

template<typename T,typename...Args> 
void test(int& sum,T v,Args... args) 
{ 
    sum+=v; 
    test(sum,args...); 
} 

template<typename T,typename...Args> 
decltype(test<T, Args...>)* sum = &(test<T, Args...>); 

int  main(void) 
{ 
    int res = 0; 
    sum<int, int>(res, 4, 7); 
    std::cout << res << std::endl; 
} 

वैकल्पिक रूप से एक और variadic समारोह में लपेट और std::forward तर्क:

template<typename T,typename...Args> 
void other(int&sum, T v, Args&&... args) 
{ 
    test(sum, std::move(v), std::forward<Args>(args)...); 
} 
+1

दिलचस्प है, लेकिन मुझे संदेह है कि कटौती इस "उपनाम" के लिए काम करेगी। – dyp

+0

@dyp वर्तमान में यह सामान्य कंपाइलर्स के साथ नहीं है, लेकिन शायद कुछ दिन अब तक नहीं :) :) – Drax

+0

हम्म मुझे * परिवर्तनीय टेम्पलेट्स के लिए वाक्यविन्यास पर संदेह है * इसका समर्थन करेगा; चूंकि टेम्पलेट परिभाषित फ़ंक्शन कॉल के तर्कों से मेल खाने के लिए कोई पैटर्न नहीं है। परिवर्तनीय टेम्पलेट के विशेषज्ञों पर विचार करें। केवल बहुत सीमित संदर्भों में एक चर टेम्पलेट को उपनाम के रूप में देखा जा सकता है, और संकलक को अमूर्तता की इस परत को "देखना" देखना था। – dyp

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