我正在寻找一种将特征功能委托(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
。
感谢您的帮助。
编辑: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> {};
关于c++ - 如何将特征功能委托(delegate)给类(class)成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39365992/