2011-10-07 18 views
5

varsa bir üye işlevini çağırın. Şablon parametresi T olan bir A sınıfına sahibim. T sınıfının func1() fonksiyonunu sunduğu durumlarda kullanım durumları vardır ve burada T yokken kullanım durumları vardır. teklif etmeyin. A'daki f() işlevi, varsa func1() işlevini çağırmalıdır. Sanırım bu destek mpl ile mümkün olmalı, ama nasıl bilmiyorum. İşte bazı sözde kodu:Yükseltme MPL: Sadece (0)

template<class T> 
class A 
{ 
    void f(T param) 
    { 
     if(T::func1 is an existing function) 
      param.func1(); 
    } 
}; 

Daha da iyisi bir başka durum olacaktır: o TMP için kesinlikle var olduğu

template<class T> 
class A 
{ 
    void f(T param) 
    { 
     if(T::func1 is an existing function) 
      param.func1(); 
     else 
      cout << "func1 doesn't exist" << endl; 
    } 
}; 
+2

Kodun derlenmeyeceği uygun bir durum bulmayı başarsanız bile. Her iki dalı da derlemek zorundadır ve işlev yoksa, gerçek şube derlenmez. –

+0

Şablon uzmanlığı ile her iki parçanın da derlenmesi gerekmez. Bir şekilde T parametresiyle bir şablon işlevini çağırmak zorunda kalacağım ve T işlevi sunarken veya func1() sunmadığında bu işlevin farklı bir davranışı vardır. Eminim ki mpl bu kullanım davası için bir şey sunuyor. Sadece nasıl kullanacağımı bilmiyorum. – Heinzi

+0

C++ 11 bir seçenek midir? –

cevap

7

Boost.MPL bununla başa etmez ve üyeleri diyemezsin TMP'de. Boost.Fusion ve Boost.TypeTraits ya bir şey yok; Onlardan birinin olacağını sanıyordum ama görünüşe bakılırsa yanlış anlaşılıyor.

Here ve here, C++ 03'teki bir üyeyi algılamak için bir yazının nasıl yazılacağı konusunda bazı çözümlerdir. Eğer böyle bir özelliği sahip olduktan sonra SFINAE için kullanabilirsiniz, (bunu has_func1_member arayacağım): C++, 11 ile ilk etapta özelliği yazmak daha kolay olduğunu

template<typename T> 
typename boost::enable_if<has_func1_member<T> >::type 
maybe_call(T& t) 
{ t.func1(); } 

template<typename T> 
typename boost::disable_if<has_func1_member<T> >::type 
maybe_call(T&) 
{ 
    // handle missing member case 
} 

// your example code would then do: 
maybe_call(param); 

Not, hala olmasına rağmen biraz arcane.

+0

Aslında bunu kendiniz yazmak zorunda mısınız? Is_member_function_pointer hile yapmak değil mi? http://en.cppreference.com/w/cpp/types/is_member_function_pointer veya Boost: http://www.boost.org/doc/libs/1_51_0/libs/type_traits/doc/html/boost_typetraits/reference/is_member_function_pointer .html – Gurgeh

+0

@Gurgeh C++ 03'te yardımcı olmaz. C++ 11'de çalışacak bir şey yazabilirsiniz, ancak muhtemelen aşırı yüklenmiş üye işlevleri ile başarısız olur (yanlış bir negatif bildirir) ve bu dezavantaj olmadan bunu yapmanın daha kolay yolları vardır. –