SORU
22 EKİM 2011, CUMARTESİ


"açmak" eşleşen bir işlev işaretçisi aramak için bir demet

std::tuple Bir sonraki saklı türleri ile eşleşen bir işlev işaretçisi için bir çağrı için değişken olarak kullanılacak olan değerler, çeşitli sayıda depolamak için çalışıyorum.

Basitleştirilmiş bir örnek çözmek için mücadele ediyorum sorunu gösteren oluşturduk:

#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 sorunları içeren std::tuple veya variadic şablonları istiyorum yazmak başka bir şablon gibi template <typename Head, typename ...Tail> yinelemeli olarak değerlendirmek tüm türleri tek tek, ama göremiyorum bir yolu bunu yapmak için gönderen bir işlev çağrısı.

Bunun için gerçek motivasyonu biraz daha karmaşıktır ve çoğunlukla sadece bir öğrenme egzersiz zaten.

Ne temiz bir şekilde gönderme çağrısı kullanarak std::tuple ya da bir alternatif daha iyi bir şekilde sağlandığı aynı net sonuç saklanması ve iletilmesi konusunda bazı değerler ve bir işlev işaretçisi kadar keyfi bir geleceğe işaret?

CEVAP
22 EKİM 2011, CUMARTESİ


Sayı parametresi bir paket oluşturmak ve bunları çözmeniz gerekiyor

template<int ...>
struct seq { };

template<int N, int ...S>
struct gens : gens<N-1, N-1, S...> { };

template<int ...S>
struct gens<0, S...> {
  typedef seq<S...> type;
};


// ...
  void delayed_dispatch() {
     callFunc(typename gens<sizeof...(Args)>::type());
  }

  template<int ...S>
  void callFunc(seq<S...>) {
     func(std::get<S>(params) ...);
  }
// ...

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BumbleDroid

    BumbleDroid

    18 EKİM 2010
  • chrmoe

    chrmoe

    7 Kasım 2006
  • RD

    RD

    19 NİSAN 2006