मेरे पास एक साधारण वर्ग A
है, जो एक विविध कार्य टेम्पलेट प्रदान करता है। यह फ़ंक्शन A
के भीतर से निजी डेटा का उपयोग करता है, लेकिन फ़ंक्शन स्वयं सार्वजनिक है।परिवर्तक फ़ंक्शन टेम्पलेट के लिए सूचक
int main(int argc, char *argv[]) {
A a;
a.bar(1, "two", 3, 4);
foo(&a.bar);
}
:
class A {
public:
A() :
_bla("bla: ") {
}
template <class T>
void bar(const T& value) {
std::cout << _bla << value << std::endl;
}
template <class H, class... T>
void bar(const H& value, const T&... data) {
std::cout << _bla << value << std::endl;
bar(data...);
}
private:
const std::string _bla;
};
एक अलग फाइल में, foo.hpp नाम है, मैं एक समारोह foo()
, कि प्राप्त करते हैं और एक तर्क के रूप समारोह a.bar()
उपयोग करने में सक्षम होना चाहिए: वर्ग इस प्रकार है
मुझे यह सुनिश्चित नहीं है कि कहां से शुरू करना है, लेकिन मैंने निम्नलिखित की कोशिश की है - जो काम नहीं करता है। मैं कैसे इसे सही ढंग से कर सकते हैं:
template <typename... T>
inline void foo(void (bar *)(const T&...)) {
unsigned int x(0), y(0), z(0);
bar(x, y, z);
}
बोनस सवाल:
foo(&a.bar);
लेकिन यह भी a.bar
कुछ मानकों करने के लिए बाध्य के साथ foo
कहते हैं, जैसे:
foo(&(a.bar(p1, p2));
मैं बस p1
और p2
सेजोड़ सकता हूं 10 परिभाषा ही है, में की तरह:
foo(p1, p2, &a.bar);
लेकिन यह शब्दार्थ मेरा उद्देश्य के लिए बेहतर होगा अगर मैं इन मानकों से पहले जोड़ सकते हैं।
'enable_if' गड़बड़ क्यों? आप इसे 'शून्य बार() {} 'के रूप में अधिभारित कर सकते हैं। – jrok
वैसे, यह तर्क देने के लिए 'enable_if' का उपयोग करने की आवश्यकता नहीं है कि तर्क पैक खाली है या नहीं। '(एच, टी ...) 'के लिए बस एक टेम्पलेट अधिभार है और कोई भी अधिभार नहीं है जो कुछ भी नहीं करता है। –
'foo' फ़ंक्शन स्वीकार करता है, लेकिन 'a.bar' कोई फ़ंक्शन नहीं है। यह एक टेम्पलेट है। टेम्पलेट्स के पास कोई पता नहीं है। कार्य 'a.bar ',' a.bar 'आदि हैं; आप किसको 'foo' पास करना चाहते हैं? साथ ही, आप कुछ पैरामीटर और 'a.bar (p1, p2)' के फ़ंक्शन के रूप में 'a.bar (p1, p2)' को किसी फ़ंक्शन के रूप में अलग-अलग पैरामीटर पर पूरी तरह से लागू करने के तरीके के रूप में कैसे अंतर करते हैं? –