c – 如何将traits功能委托给类成员?

我正在寻找一种将特征功能委托给成员的方法.此时,继承不是一种选择.
因此,假设我们有一个B类和2个不同的Traits已经在使用该类.

struct B
{};

template<typename T>
struct Trait1
{
    static
    void foo1(T t)
    {}
};

template<>
struct Trait1<B>
{
    static
    void foo1(B t)
    {}
};

template<typename T>
struct Trait2
{
    static
    void foo2(T t)
    {}
};

template<>
struct Trait2<B>
{
    static
    void foo2(B t)
    {}
};

我还有一个聚合类C,有2个B类成员,如:

struct C
{
    B m1;
    B m2;
};

现在我想要为该C类定义两个Traits,并委托给相应的成员.简单的方法是s.th.喜欢:

template<>
struct Trait1<C>
{
    static
    void foo1(C t)
    {
        Trait1<B>::foo1(t.m1);
    }
};

template<>
struct Trait2<C>
{
    static
    void foo2(C t)
    {
        Trait2<B>::foo2(t.m2);
    }
};

对于具有许多功能的特性而言,这些特性很烦人且可能存在复制粘贴错误.所以问题出现了,有没有办法以优雅的方式委托功能(C 11首选,C 14/17也可以)?含义如果Trait1使用成员m1和Trait2使用成员m2.
感谢帮助.

编辑:Trait1和Trait2的方法实际上有不同的名称.
而在野外,用2替换1的宏将不起作用,因此我鼓励不使用宏.

解决方法:

您可以为因子分解代码创建通用特征

template<template <typename> class Trait, typename T, typename T2, T2 (T::*M)>
struct GenTrait
{
    static
    void foo(T t)
    {
        Trait<T2>::foo(t.*M);
    }
};

然后

template<>
struct Trait1<C> : GenTrait<Trait1, C, B, &C::m1> {};

template<>
struct Trait2<C> : GenTrait<Trait2, C, B, &C::m2> {};
上一篇:AHB总线协议


下一篇:如何在PHP中调用“父”特征方法?