2015-10-27 54 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

相关问题