c++ - 确保一个类不继承自两个接口(interface)

标签 c++ c++14

我有这个问题。有一个我们开发和使用的框架。我们有一些该框架的用户需要实现的接口(interface)。我想确保其中两个接口(interface)永远不能在同一个类上实现。这是一个例子

class A{
  void a() = 0;
};
class B{
  void b() = 0;
};

class C: public A, public B { // This should give error
};
class D: public A{ // OK
};
到目前为止,我想也许我可以使用 static_assertstd::is_convertible但我不知道该怎么做。
编辑:
我不知道谁来编写派生类,所以如果可能的话,我想把它放在基接口(interface)中。基本上假设我无权访问派生类,因为它们不在我们的代码库中。
谢谢。

最佳答案

像这样写自己的特质:

template<typename Derived, typename... BaseCandidates>
struct has_no_base;

template<typename Derived>
struct has_no_base<Derived>
    : std::true_type { };

template<typename Derived, typename BaseFirst, typename... BasesRest>
struct has_no_base<Derived, BaseFirst, BasesRest...>
    : std::conditional_t<
        std::is_base_of<BaseFirst, Derived>,
        std::true_type,
        has_no_base<Derived, BasesRest...>
      > { };

template<typename Derived, typename... PossibleBases>
struct has_only_one_base;

template<typename Derived>
struct has_only_one_base<Derived>
    : std::false_type { };

template<typename Derived, typename Base>
struct has_only_one_base<Derived, Base>
    : std::conditional_t<
        std::is_base_of_v<Base, Derived>,
        std::true_type,
        std::false_type
      > { };

template<typename Derived, typename BaseFirst, typename... BasesRest>
struct has_only_one_base<Derived, BaseFirst, BasesRest...>
    : std::conditional_t<
        std::is_base_of_v<BaseFirst, Derived>,
        has_no_base<Derived, BasesRest...>,
        has_only_one_base<Derived, BasesRest...>
      > { };
并像这样使用它:
class MyClass : public A, public B
{
    static_assert(has_only_one_base<MyClass, A, B>::value, "Error");
};
此外,只要您是该框架的开发人员,您可以提供一些检查特征:
template<typename Type>
using is_valid_class = has_only_one_base<Type, IFirst, ISecond, ... ILast>;
并使用它:
class MyClass : public A, public B
{
    static_assert(is_valid_class<MyClass>::value, "Error");
};

关于c++ - 确保一个类不继承自两个接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62846773/

相关文章:

c++ - 删除通过取消引用新对象初始化的对象

c++ - FLTK 不适用于 Stroustrup header

c++ - 无法在未定义的情况下声明模板变量

c++ - 问题产生应用程序

c++ - 在 2 个线程中 boost 套接字

c++ - 使用 C++11/14 正确定义 DLL 接口(interface)

c++ - 从 "parent"项指针获取 `std::tuple` "children"

c++ - C++ 中 (x) 的类型

c++ - 将 time_point 转换为字符串的最漂亮方法是什么?

c++ - 为 C++ 提供标准 GUI 库的缺点是什么?