Bu sorunun daha önce sorulmuş olduğunu biliyorum, ancak oldukça deneyimli bir kodlayıcı olmasına rağmen, yanıtları anlamıyorum ve sormak için bu önceki sorulara yanıt vermenin bir yolunu görmüyorum açıklama. "Cevap" bağlantısı yok ya da bir şey yok. Ayrıca, bu sorular oldukça eskiydi. Yani, ben soruyu yeniden soruyorum.C++ 'da std :: function imzası üzerine aşırı yüklenme nasıl yapılır?
+ = operatörünü aşırı yüklediğim bir sınıfa sahibim. Bir aşırı yük çıplak işlev işaretçisi almak istiyorum, ve diğer bir std :: işlevi almaya:
void operator+=(void (*handler)());
void operator+=(function<void (void *, T)> handler);
Kullanımı: derleyici belirleyemiyor çünkü
MyClass a;
a += [](){ DoSomething(); };
a += [](void *x, T y){ DoSomething(); };
Maalesef kod derleme değil ikinci aşırı yükün ilk + = çağrı için uygun olmadığı.
Bu sorunu gidermek için operatör + = üye işlevlerimi nasıl tanımlarım? Operatörlerin nasıl kullanıldığını değiştirmek istemiyorum (ör. Açık bir yayın kullanarak). Yukarıda gösterildiği gibi çalışmasını istiyorum.
void operator+=(function<void()> handler);
Ama yine, ben işlevi <> şablon imzası dayalı aşırı yük olamaz:
Buna ek olarak, aynı zamanda aşağıdaki aşırı olması kullanışlı olurdu.
diğer örnekler için bu thread bakınız: Isn't the template argument (the signature) of std::function part of its type? (O parçacığı belirtilen çeşitli çözümler uygulayan çalıştı ve bunlardan hiçbiri derlemek olurdu) Ben bir dizi uzun yıllar programlama oldum
diller, ama benim C++ becerilerim biraz paslı.
** büyük ** soru şudur: __what, belirli bir işlev göstergesini veya "std :: function" nesnesini, aşırı yükünüzde yapacaksınız, operatör + = '? __ – zaufi
@zaufi: Nasıl olduğunu göremiyorum Bu alakalı, ama tamam. Bunu std :: event handler işlevlerine ekleyeceğim. Esasen .NET olaylarını C++ uygulamasında yapıyorum. Çünkü bu güçler, kafalarını, Olaylar ve Özellikler gibi, Kapanışlar gibi, modern bir programlama dili için kesinlikle gerekli işlevsellikler etrafında sarmıyorlardı. –
öyleyse, o zaman bir std :: vector' ile std :: function' ile tam olarak bir tane ('void() ') imzası imzalı bir imzanız olmalıdır. Doğru muyum? – zaufi