SORU
23 Temmuz 2009, PERŞEMBE


İşlev olarak şablon bağımsız değişken geçirildi

Kuralları argüman olarak geçen C şablonlar fonksiyonları içeren arıyorum.

Bu bir örnek olarak gösterilen C tarafından desteklenir:

#include <iostream>

void add1(int &v)
{
  v =1;
}

void add2(int &v)
{
  v =2;
}

template <void (*T)(int &)>
void doOperation()
{
  int temp=0;
  T(temp);
  std::cout << "Result is " << temp << std::endl;
}

int main()
{
  doOperation<add1>();
  doOperation<add2>();
}

Bu tekniği öğrenmeye zor, ancak. Googling for "function as a template argument" kadar takip etmez. Ve klasik C Templates The Complete Guide şaşırtıcı derecede de (en azından benim arama değil) konuşmaz.

Bu geçerli bir C (veya sadece bazı yaygın olarak desteklenen uzantı) olup olmadığını ben sorulardı.

Ayrıca, birbirinin şablonu çağırma bu tür sırasında açık işlevleri ile kullanılmak üzere aynı imza ile bir functor izin vermek için bir yolu var mı?

Aşağıdakileri yapardeğilsözdizimi açıkça yanlış olduğu için en az Visual C yukarıdaki program içinde çalışıyoruz. Çok iyi olur edebilmek için geçiş işlevi için bir functor ve tersi, benzer şekilde iletebilirsiniz bir işlev işaretçisi veya functor için std::sıralama algoritması istiyorsanız tanımlamak için özel bir karşılaştırma çalışması.

   struct add3 {
      void operator() (int &v) {v =3;}
   };
...

    doOperation<add3>();

Web bir bağlantı ya da iki, ya da C Şablonlar kitabın sayfası işaretçiler mutluluk duyacağız!

CEVAP
23 Temmuz 2009, PERŞEMBE


Evet, geçerlidir.

Bu funktorlar ile de iş yapmaya gelince, her zamanki çözüm bunun yerine gibi bir şey:

template <typename F>
void doOperation(F f)
{
  int temp=0;
  f(temp);
  std::cout << "Result is " << temp << std::endl;
}

şimdi ya: olarak adlandırılan olabilir

doOperation(add2);
doOperation(add3());

Sorunun bu olduğunu yapar eğer zor için derleyici satır içi arama add2 beri tüm derleyici bilen bir işlev işaretçisi türü void (*)(int &) geçirilen doOperation. (Ama add3, Bir functor kolayca inlined olabilir. Burada, derleyici tür bir nesne add3 çağrı fonksiyonu ** 13, ve sadece bazı bilinmeyen işlev işaretçisi olduğu anlamına gelir işlevi, geçirilen bilir.)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Atlantic Records

    Atlantic Rec

    15 Aralık 2006
  • Derek Banas

    Derek Banas

    12 AĞUSTOS 2008
  • michellefeng's channel

    michellefeng

    26 Kasım 2006