在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/

10-10 10:34