2017-12-16 98 views
8

मैं विशेषज्ञता के साथ निम्न टेम्पलेट समारोह है:पैरामीटर पैक में प्रत्येक तत्व पर समारोह लागू

// Pass the argument through ... 
template<typename T, typename U=T> 
U convert(T&& t) { 
    return std::forward<T>(t); 
} 

// ... but convert std::strings 
const char* convert(std::string s) { 
    return s.c_str(); 
} 

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

template<typename ... Args> 
void doSomething(Args ... args) { 
    // Convert parameter pack using convert function above 
    // and call any other variadic templated function with 
    // the converted args. 
} 

वहाँ किसी भी तरह से परिवर्तित करने के लिए है टिप्पणी में कनवर्ट फ़ंक्शन का उपयोग कर पैरामीटर पैक?

मेरा मूल लक्ष्य स्ट्रिंग :: स्ट्रिंग में '% s' को पास करने में सक्षम होना था, जैसे स्ट्रिंग पर मैन्युअल रूप से .c_str() को मैन्युअल रूप से कॉल करने के बिना। लेकिन अगर मैं इसे सरल तरीके से किया जा सकता हूं, तो मुझे सामान्य रूप से भी दिलचस्पी है, मेरी कोशिशें अब तक विफल रही हैं।

+0

बीटीडब्ल्यू, आपका 'doSomething' अग्रेषण संदर्भ स्वीकार नहीं करता है, जबकि' कनवर्ट 'का तात्पर्य है। इसके अलावा 'कन्वर्ट (std :: string)' एक लटकते पॉइंटर देता है। तो आप कुछ बदलाव करना चाह सकते हैं। – StoryTeller

+0

@StoryTeller अगर मैंने सुझाव दिया है कि मैं इसे प्रिंट करना चाहता हूं तो मुझे लगता है कि यह सूचक के साथ ठीक है क्योंकि मैं इसे चारों ओर रखने की योजना नहीं बना रहा हूं? – Zitrax

+0

's' कनवर्ट करने के लिए स्थानीय है। यह ठीक कैसे हो सकता है? – StoryTeller

उत्तर

10
template<typename ... Args> 
void doSomething(Args ... args) { 
    something(convert(args)...); 
} 

कहाँ something(convert(args)...) एक parameter pack expansion कि करने के लिए फैलता है:

// pseudocode 
something(convert(arg0), convert(arg1), convert(arg2), ...) 

BTW, आप अनावश्यक प्रतियां से बचने के लिए अग्रेषण संदर्भ द्वारा args लेने के लिए और ठीक से प्रचार करने के लिए चाहते हो सकता है lvalue संदर्भ:

template<typename... Args> 
void doSomething(Args&& ... args) { 
    something(convert(std::forward<Args>(args))...); 
} 
संबंधित मुद्दे