我正在寻找一种将特征功能委托给成员的方法.此时,继承不是一种选择.
因此,假设我们有一个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> {};