SORU
28 EYLÜL 2011, ÇARŞAMBA


Genel std::kullanarak bir sınıfın üye fonksiyonları ile fonksiyon nesneleri

Bir sınıf için bir map std::function nesneleri saklamak aynı sınıfın üye fonksiyonları için bazı işlev işaretçileri saklamak istiyorum. Ama bu kod ile ilk sırada ben başarısız:

class Foo {
    public:
        void doSomething() {}
        void bindFunction() {
            // ERROR
            std::function<void(void)> f = &Foo::doSomething;
        }
};

xxcallobj error C2064: term does not evaluate to a function taking 0 arguments garip bir şablon örnekleme hataları ile birlikte alıyorum. Şu anda Visual Studio 2010/2011 ile Windows 8 üzerinde çalışıyorum ve VS10 ile Win 7 de başarısız olur. Hata takip etmem biraz garip C kurallara dayalı olmalıdır.

EDİT: ben biliyorumDEĞİLboost kullanın. Bu MS derleyici C 11 entegre edilmiştir.

CEVAP
28 EYLÜL 2011, ÇARŞAMBA


Statik olmayan üye işlev bir nesne ile çağrılmalıdır. O, her zaman "bu" argüman olarak bir işaretçi. örtülü olarak geçer.

std::function imza fonksiyon herhangi bir parametre (**10) almaz belirtir çünkü, gerekirbağlama(ve sadece) ilk argümanı.

std::function<void(void)> f = std::bind(&Foo::doSomething, this);

Eğer parametreleri ile bir fonksiyonu bağlamak istiyorsanız, tutucular belirtmeniz gerekir:

using namespace std::placeholders;
std::function<void(int,int)> f = std::bind(&Foo::doSomethingArgs, this, _1, _2);

Ya da, eğer derleyici destekliyorsa C 11 Lambda:

std::function<void(int,int)> f = [=](int a, int b) {
    this->doSomethingArgs(a, b);
}

(Eldeki C 11 uyumlu bir derleyici yokşu andabunu kontrol edemiyorum.)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Matthew Pearce

    Matthew Pear

    9 AĞUSTOS 2009
  • MattSteffanina 2

    MattSteffani

    28 Kasım 2007
  • Rockstar Games

    Rockstar Gam

    17 ŞUBAT 2006