Saya mencoba untuk menyimpan dalam std::tuple
berbagai jumlah nilai, yang nantinya akan digunakan sebagai argumen untuk panggilan ke pointer fungsi yang cocok dengan tipe yang disimpan.
Saya telah membuat contoh sederhana yang menunjukkan masalah yang saya sedang berjuang untuk pecahkan:
#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();
}
Biasanya untuk masalah yang melibatkan std::tuple
atau templat variadik, saya akan menulis templat lain yang ingin template <typename Head, typename ...Tail>
secara rekursif mengevaluasi semua jenis satu per satu, tetapi saya tidak dapat melihat cara melakukan hal itu untuk mengirim panggilan fungsi.
Motivasi nyata untuk ini agak lebih kompleks dan itu sebagian besar hanya latihan belajar saja. Anda dapat mengasumsikan bahwa saya menyerahkan tuple dengan kontrak dari antarmuka lain, jadi tidak dapat diubah tetapi keinginan untuk membukanya menjadi panggilan fungsi adalah milik saya. Ini std::bind
mengesampingkan penggunaan sebagai cara murah untuk menghindari masalah mendasar.
Apa cara bersih pengiriman panggilan menggunakan std::tuple
, atau cara alternatif yang lebih baik untuk mencapai hasil bersih yang sama dari menyimpan / meneruskan beberapa nilai dan penunjuk fungsi sampai titik masa depan yang sewenang-wenang?
auto saved = std::bind(f, a, b, c);
... lalu meneleponsaved()
?