在Java泛型中,我们可以简单地使用MyClass<T implements SomeInterface>
。但是,我无法想到与此等效的C++。
然后,当我有模板类T
时,如何指定该T
支持哪些特定方法?
最佳答案
概念就是您想要的。但是,它们尚未在当前的C++标准中。所以您可以做的就是使用SFINAE
一个类型特征可以确定某种类型是否尊重某种类型的接口(interface),并且可以使用正在寻找某个成员的许多类型特征来实现。
这是用于确定类是否具有特定成员的类型特征,如下所示:
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;
};
因此,到目前为止,您已经可以检查特定成员。要检查接口(interface),可以执行以下操作:
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
};
关于c++ - 如何指定模板类在C++中实现某些方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33375548/