2015-10-27 53 views
2

在Java泛型中,我們可以簡單地使用MyClass<T implements SomeInterface>。但是,我想不出一個C++的等價物。如何指定模板類在C++中實現某些方法?

然後,當我有一個模板類T,我該如何指定這個T支持什麼特定的方法?

+0

我認爲這是在這裏得到解答:http://stackoverflow.com/questions/122316/template-constraints-c – GreatAndPowerfulOz

+1

查找C++概念。這些是實驗性的。你可以從http://en.cppreference.com/w/cpp/concept –

+0

開始Waaay對於C++來說太廣泛了。你想要解決什麼具體問題? – Barry

回答

2

概念是你在找什麼。但是,他們還沒有使用當前的C++標準。那麼,什麼可以做,這是使用SFINAE

A型特徵,以確定是否某些類型的尊重某種接口可以與正在尋找一個特定的成員很多類型特質進行。

這是什麼類型的特質對,以確定是否一個類有一個特定的成員是這樣的:

template<typename T> 
struct has_member1 { 
private: 
    template<typename C> static std::true_type test(decltype(C::THE_MEMBER_NAME)*); 
    template<typename C> static std::false_type test(...); 

public: 
    constexpr static bool value = decltype(test<T>(nullptr))::value; 
}; 

所以,現在你已經可以查詢特定成員。要檢查的接口,你可以做這樣的事情:

template<typename T> 
struct is_my_interface { 
    constexpr static bool value = 
     has_member1<T>::value && 
     has_member2<T>::value && 
     has_member3<T>::value; 
}; 

現在你的模板類:

// declare it 
template<typename, typename = void> struct MyClass; 


template<typename T> 
struct MyClass<T, enable_if_t<is_my_interface<T>>> { 
    // class body 
}; 
+1

C++ 11還增加了對['的std :: is_base_of'](HTTP支持: //en.cppreference.com/w/cpp/types/is_base_of)。 – Jason

相關問題