在Java泛型中,我们可以简单地使用MyClass<T implements SomeInterface>
。但是,我想不出一个与此类似的C ++。
然后,当我有一个模板类T
时,如何指定T
支持哪些特定方法?
答案 0 :(得分:2)
概念就是你要找的。但是,它们尚未达到当前的C ++标准。所以你能做的就是使用SFINAE
一种类型特征,用于确定某种类型是否可以通过寻找特定成员的许多类型特征来构建某种类型的接口。
这是确定某个类是否具有特定成员的类型特征:
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
};