c++ - C++中如何指定模板类实现某些方法?

标签 c++ templates

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

相关文章:

c++ - bash:无法执行二进制文件:Exec 格式错误,即使二进制文件和 Linux 是 64 位的

c++ - 签名输出运算符重载

具有外部实现的 C++ 静态模板

c++ - 哪个编译器用于函数中的默认模板参数

python - 扩展 setuptools 扩展以在 setup.py 中使用 CMake?

c++ - C/C++ 中的跨平台线程/静态变量 fork

c++ - 多重声明 gcc 的问题

c++ - QT Creator 配置更改以解决链接错误?

c++ - C++中的模板如何在后台实际工作?

c++ - 编译模板类时,复制构造函数出现 "no member function declared in class"错误