2016-05-17 38 views
6

C++ 03'te derleme, int döndüren üye işlevinin bir işaretçi-üyesi işlevini döndüren bir sınama şablonu işlevi yazmayı denedimİşaretçi-üye işlevini döndürme (yazım hatası olmadan)

template<typename TemplateClass> 
int (TemplateClass::*)(float,float) Testtest(TemplateClass &A) 
{ 
    return &TemplateClass::Function; 
} 

Ama doğal olursa olsun, derleyici başlatma hataları şikayet kullandığım işaretçi-to-üye-fonksiyonu sözdizimi geçenleri varyasyonları: ve iki şamandıra bağımsız değişkeni alır. Typedef, bilinen sınıflarla birlikte çalışsa da, açık nedenlerle (çakışmaların isimlendirilmesi), aynı işlevi kullanması muhtemel olan zamanın önünde bilmediğim sınıflar için şablon sınıfı argümanlarını kabul etmeyecektir.

İşaretçi-üye işlevini derlemek ve döndürmek için bu işlevi almak için yazılmamış bir yol var mı?

cevap

5

tip kesinti olmadan, bir tür adları olmayan beyan ve sonrasında bir eğik dönüş türü olmayan için:

template<typename TemplateClass> 
int (TemplateClass::* Testtest(TemplateClass &A))(float,float) 

Ama bu tabii

sen ne değildir gerçek kodda kullanırdı. (C++ 11)

template<typename TemplateClass> 
auto Testtest(TemplateClass &A) 

Veya bir eğik dönüş türü: C++ 14'de

template<typename T> 
using return_type = int (T::*)(float,float); 

template<typename TemplateClass> 
return_type<TemplateClass> Testtest(TemplateClass &A) 

Ya dönmek tip kesinti:

template<typename TemplateClass> 
auto Testtest(TemplateClass &A) -> int (TemplateClass::*)(float,float) 
+0

Birincisini tahmin edemezdim. Çok ... kıvrımlı. C++, neden bunu yapıyorsun? – c1646091

+1

@ c1646091 Bu sözdizimi C. – emlai

+2

C'den miras aldınız, neden bunu yapıyorsunuz ?! – c1646091

2
int (Class::*f())(float,float); 

f sınıfı Class takinf üyesi işlevine göre 2 yüzen işaretçiyi geri ve int dönen bir bağımsız değişken almak fonksiyonudur.

Ve şablon sürümü:

  template <typename Type> 
     int (Type::*f())(float,float); 
3
yerine bir alias template kullanırsınız

Bu prototip gerekir:

template<typename TemplateClass> 
int (TemplateClass::*Testtest(TemplateClass &A)) (float,float) { } 
0

Sorunun önermesini reddediyorum. Typedefs kullanın. Ya da, özellikle bir tür özelliği: aslında türü döndüren dolambaçlı sözdizimi daha anlamak için bir yol daha kolaydır

template <class T, class F> 
struct make_mem_fun { 
    typedef F T::*type; 
}; 

template<typename TemplateClass> 
typename make_mem_fun<TemplateClass, int(float, float)>::type 
Testtest(TemplateClass &A) 
{ 
    return &TemplateClass::Function; 
} 

. C++ 11 ile, bunu typename ::type öğelerini bırakmak için bir takma adıma dönüştürebiliriz.

+0

* Sorunun önermesini neden reddediyorsunuz? Typedefs, dediği gibi, şablonlarla çalışmaz - bir yapının bir tür iş olarak kullanılmasından anlaşıldığı gibi. Bir işaretçi-üye işlevini döndüren bir işlevin sözdiziminin neyi uygulayabileceğimi değil, aynı zamanda onu uygulayabilmem için garip bir "her zaman yazılan" geçici çözümde gömmek yerine, kişisel olarak ne olduğunu bilmeyi tercih ederim. ayrıca onu da tanımlayın. Bilgi çok iyi gömülmüş olsa bile, birden fazla arama yapamadı, deneme başarısız oldu ve SO'ya sormaya zorlandım. – c1646091

+0

@ c1646091 Bir bakışta neyin (TemplateClass :: * Testtest (TemplateClass & A)) (float, float) anlamına geldiğini anlayabilir misiniz? Onu ayrıştırmak 10 dakikamı alacaktı. Make_mem_fun 'ın ne anlama geldiğini anlama? Kekin parçası. – Barry

+0

@ c1646091 Ve cevabımın gösterdiği gibi, yazım hataları şablonlarla çalışır.Bu bir C++ 03 şablonu typedef. C++ 11'de daha az ayrıntılı hale gelir, fakat var olmadığı gibi değildir. – Barry