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