मैं std::tuple
अलग-अलग संख्या में मूल्यों को संग्रहीत करने की कोशिश कर रहा हूं , जिसे बाद में फ़ंक्शन पॉइंटर को कॉल के लिए तर्क के रूप में उपयोग किया जाएगा जो संग्रहीत प्रकारों से मेल खाता है।
मैंने एक सरलीकृत उदाहरण बनाया है जिसमें समस्या को हल करने के लिए संघर्ष कर रहा हूं:
#include <iostream>
#include <tuple>
void f(int a, double b, void* c) {
std::cout << a << ":" << b << ":" << c << std::endl;
}
template <typename ...Args>
struct save_it_for_later {
std::tuple<Args...> params;
void (*func)(Args...);
void delayed_dispatch() {
// How can I "unpack" params to call func?
func(std::get<0>(params), std::get<1>(params), std::get<2>(params));
// But I *really* don't want to write 20 versions of dispatch so I'd rather
// write something like:
func(params...); // Not legal
}
};
int main() {
int a=666;
double b = -1.234;
void *c = NULL;
save_it_for_later<int,double,void*> saved = {
std::tuple<int,double,void*>(a,b,c), f};
saved.delayed_dispatch();
}
आम तौर पर समस्याओं std::tuple
या वैरेडिक टेम्प्लेट को शामिल करने के लिए, मैं एक और टेम्प्लेट लिखूंगा जैसे template <typename Head, typename ...Tail>
कि एक-एक करके सभी प्रकारों का पुनर्मूल्यांकन करना , लेकिन मैं फंक्शन कॉल भेजने के लिए ऐसा करने का तरीका नहीं देख सकता।
इसके लिए असली प्रेरणा कुछ अधिक जटिल है और यह ज्यादातर वैसे भी सीखने का अभ्यास है। आप यह मान सकते हैं कि मुझे दूसरे इंटरफ़ेस से अनुबंध करके टपल सौंप दिया गया है, इसलिए इसे बदला नहीं जा सकता है, लेकिन इसे फ़ंक्शन कॉल में अनपैक करने की इच्छा मेरी है। यह std::bind
अंतर्निहित समस्या को दूर करने के सस्ते तरीके के रूप में उपयोग करता है।
कॉल का उपयोग कर भेजने के लिए एक साफ तरीका क्या है std::tuple
, या भंडारण / कुछ मूल्यों और एक समारोह सूचक अग्रेषण एक मनमाना भविष्य बिंदु तक का एक ही शुद्ध परिणाम प्राप्त करने के लिए एक विकल्प बेहतर तरीका?
auto saved = std::bind(f, a, b, c);
... फिर बाद में बस कॉल करेंsaved()
?