c++ - 如何将特征功能委托(delegate)给类(class)成员?

标签 c++ c++11 delegates traits

我正在寻找一种将特征功能委托(delegate)给成员的方法。在这一点上继承不是一个选项。
因此,假设我们有一个类 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,该类 B 有 2 个成员,例如:

struct C
{
    B m1;
    B m2;
};

现在我还想为该类 C 定义两个 Traits,并委托(delegate)给适当的成员。简单的方法是 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);
    }
};

对于具有很多功能的 traits,这有点烦人并且可能有复制粘贴错误。所以问题出现在我身上,有没有办法以一种优雅的方式委托(delegate)功能(首选 C++11,也可以使用 C++14/17)?含义 如果 Trait1 使用成员 m1,对于 Trait2 使用成员 m2
感谢您的帮助。

编辑:Trait1Trait2 的方法实际上有不同的名称。 在野外,用 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> {};

关于c++ - 如何将特征功能委托(delegate)给类(class)成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39365992/

相关文章:

c++ - 切换值范围

c# - 在这种情况下,为什么 C# 无法解析正确的重载?

C# - 使用委托(delegate)每小时同时运行一个方法

swift - 弃用 Swift 3 升级协议(protocol)

c++ - 为什么在这种情况下调用 r 值引用构造函数?

java - 在 C++ 中有条件地调用 JNI

c++ - 指针分配说明

c++ - 返回自身的函数类型

c++ - Switch 语句可变模板扩展

c++ - 如何从对象的数据成员构造一个 std::set 或 Boost flat_set?