Daha std::tuple
sonra depolanan türleri eşleşen bir işlev işaretçisi için bir çağrı için bağımsız değişken olarak kullanılacak değerleri, değişen sayıda depolamaya çalışıyorum .
Çözmek için mücadele ettiğim sorunu gösteren basitleştirilmiş bir örnek oluşturdum:
#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();
}
Normalde std::tuple
veya değişken şablonlar içeren sorunlar için, template <typename Head, typename ...Tail>
tüm türleri teker teker tekrarlı olarak değerlendirmek gibi başka bir şablon yazardım , ancak bir işlev çağrısı göndermek için bunu yapmanın bir yolunu göremiyorum.
Bunun için gerçek motivasyon biraz daha karmaşıktır ve çoğunlukla sadece bir öğrenme alıştırmasıdır. Tupu başka bir arayüzden sözleşmeyle teslim ettiğimi varsayabilirsin, bu yüzden değiştirilemez, ancak bir fonksiyon çağrısına açma arzusu benimdir. Bu std::bind
, altta yatan sorunu ortadan kaldırmak için ucuz bir yol olarak kullanılmasını önler.
Aramayı kullanarak aramanın gönderilmesinin temiz bir yolu std::tuple
veya bazı değerleri ve bir işlev işaretçisini keyfi bir gelecekteki noktaya kadar saklamanın / iletmenin aynı net sonucunu elde etmenin alternatif daha iyi bir yolu nedir?
auto saved = std::bind(f, a, b, c);
... o zaman sonra araman yeterlisaved()
?