c++ - 如何告诉 C++ mixin 它实现的接口(interface)

标签 c++ mixins

我有一个接口(interface)和一个实现它的类:

class InterfaceA
{
public:
    enum Enum { X, Y, Z };
    virtual void foo(Enum &) = 0;
    virtual void bar() = 0;
};

class ClassA : public InterfaceA
{
public:
    virtual void foo(Enum & a) { 
        a = X;
    }
    virtual void bar();
};

我需要在一个方面扩展 InterfaceA 实现类的功能。据我了解,这就是 mixin 的用途。

例如foo() 应该在某些情况下更改其参数值。这是我的做法:

template <typename T>
class Mixin : public T
{
public:
    virtual void foo(Enum & a) { 
        T::foo(a);
        if (a == X){
            a = Y;
        }
    }
};

问题是,它不会编译,除非我将作用域前缀写入接口(interface)类中定义的标识符,或者像这样对它们进行类型定义:

template <typename T>
class Mixin : public T
{
public:
    typedef InterfaceA::Enum Enum;
    virtual void foo(Enum & a) { 
        T::foo(a);
        if (a == InterfaceA::X){
            a = InterfaceA::Y;
        }
    }
};

如果来自接口(interface)定义的此类类型很少,这没什么大不了的。但如果有很多,它就会变得丑陋。我希望代码能够反射(reflect)这样一个事实,即 Mixin 通过设计来操纵 InterfaceA 对象。不幸的是,从 InterfaceA 继承 Mixin 引入了一个我最好避免的“可怕的菱形”。这可能吗?

最佳答案

EnumXY 应该是依赖类型名。

并且您可以使用static_assert 来强制继承。

template <typename T>
class Mixin : public T
{
public:
    static_assert(std::is_base_of<InterfaceA, T>::value,
                  "T should inherit from InterfaceA");

    virtual void foo(typename T::Enum & a) { 
        T::foo(a);
        if (a == T::X){
            a = T::Y;
        }
    }
};

关于c++ - 如何告诉 C++ mixin 它实现的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37812133/

相关文章:

sass - SCSS 中的 & 符号和混入

c++ - 共享库和静态库如何选择?

Python mixin 扩展类属性

javascript - 带有守卫的 Lesscss Mixins。语法错误

c++ - 如何打印长双(全长)C++

css - 什么最适合用于 sass 中的主题变量或混合

javascript - Mixins 与 John Resig 的类语法

C++ --- 这些数学函数/常量不应该是未定义的吗?

c++ - 如何检查 std::string 是否确实是整数?

c++ - 如何复制结构数组?