दो या दो से अधिक उदाहरण कार्यों को देखते हुए, क्या टेम्पलेट कोड लिखना संभव है जो टेम्पलेट पैरामीटर के रूप में प्रदान किए गए फ़ंक्शन के तर्कों को कम करने में सक्षम होगा?फंक्शन पॉइंटर से तर्क सूची कैसे घटाएं?
यह प्रेरित उदाहरण है:
void do_something(int value, double amount) {
std::cout << (value * amount) << std::endl;
}
void do_something_else(std::string const& first, double & second, int third) {
for(char c : first)
if(third/c == 0)
second += 13.7;
}
template<void(*Func)(/*???*/)>
struct wrapper {
using Args = /*???*/;
void operator()(Args&& ... args) const {
Func(std::forward<Args>(args)...);
}
};
int main() {
wrapper<do_something> obj; //Should be able to deduce Args to be [int, double]
obj(5, 17.4); //Would call do_something(5, 17.4);
wrapper<do_something_else> obj2; //Should be able to deduce Args to be [std::string const&, double&, int]
double value = 5;
obj2("Hello there!", value, 70); //Would call do_something_else("Hello there!", value, 70);
}
/*???*/
के दोनों उपयोगों में, मैं बाहर काम करने के क्या मैं वहाँ डाल सकता है कि कोड के इस प्रकार के लिए सक्षम होगा कोशिश कर रहा हूँ।
निम्नलिखित काम करने के लिए, Args
की वजह से प्रकट नहीं होता है इसके पहले उपयोग करने से पहले (मैं क्या ग्रहण करने के लिए है के साथ के अलावा कई वाक्यविन्यास त्रुटियों कर रहे हैं) में परिभाषित नहीं किया जा रहा है, और यहां तक कि अगर यह किया, मैं अभी भी तलाश कर रहा हूँ एक संस्करण है कि खुद को प्रकार के स्पष्ट लेखन की आवश्यकता नहीं है:
template<void(*Func)(Args ...), typename ... Args)
struct wrapper {
void operator()(Args ...args) const {
Func(std::forward<Args>(args)...);
}
};
wrapper<do_something, int, double> obj;
आप [std :: समारोह] (मतलब http://en.cppreference.com/w/ सीपीपी/उपयोगिता/कार्यात्मक/समारोह)? – bolov
@bolov जो मैं विशेष रूप से ढूंढ रहा हूं वह उपलब्ध 'फंक्शन' से 'Args' को कम करने का एक तरीका है। 'std :: function' उन प्रकारों को टाइप पैरामीटर सूची में स्पष्ट रूप से निर्दिष्ट करके फ़ंक्शन पॉइंटर्स से मेल खाता है। – Xirema
क्या आप सी ++ 17 स्वीकार करते हैं? विंक विंक – bolov