【发布时间】:2021-06-15 13:15:49
【问题描述】:
我的程序定义了一个Animal 结构,可以使用CanSwim/CanNotSwim 和CanBark/CanNotBark 进行配置:
#include <iostream>
struct CanSwim {
};
struct CanNotSwim {
};
struct CanBark {
CanBark() : volume(10) {}
void bark() {
std::cout << "bark at volume " << volume << std::endl;
}
void setVolume(int newVolume) {
volume = newVolume;
}
private:
int volume;
};
struct CanNotBark {
};
template<class SwimType, class BarkType>
struct Animal : public SwimType, public BarkType {
Animal() = default;
};
int main() {
auto dog = Animal<CanSwim, CanBark>();
dog.bark();
auto cat = Animal<CanNotSwim, CanBark>();
cat.bark();
return 0;
}
现在,当Animal 配置了类CanNotSwim(在编译时)时,如何设置规则以自动将CanBark::volume 加倍?拥有:
auto dog = Animal<CanSwim, CanBark>();
dog.bark();
// "bark at volume 10"
auto cat = Animal<CanNotSwim, CanBark>();
cat.bark();
// "bark at volume 20"
我不打算将函数 bark() 从 CanBark 移动到 Animal。
【问题讨论】:
-
基于策略的设计的一个主要特点是策略是正交的。如果您引入这种依赖关系,则正交性不成立。如果发生这种情况,请考虑更深入地考虑您的政策。
-
@StoryTeller-UnslanderMonica 对于我的设计,大多数策略是正交的,其中一些是相关的。
标签: c++ templates template-meta-programming