আমি 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()
?