关于这个主题有相当多的信息。这更像是一个设计问题,但我会举例说明。
假设我真的想传递一个配置文件类,它决定了用户的策略。
struct ApplicationAllowedPolicy
{
public:
bool hasAccess() { return true; }
}
struct ApplicationProhibitedPolicy
{
public:
bool hasAccess() { return false; }
}
template<typename ApplicationPolicy>
class Profile : private ApplicationPolicy
{
bool hasAccess() { return ApplicationPolicy::access(); }
}
int main()
{
Profile<ApplicationAllowedPolicy> allowed;
Profile<ApplicationProhibitedPolicy> prohibited;
// do something with allowed & prohibited
}
以上内容都很好,但我们假设有很多政策需要阅读。5 似乎是一个现实世界的数字,尽管可能更多。然后,假设此配置文件将应用于数百个实例,其中 5 个策略差异很大。要启动,策略行为只能在运行时知道(从文件、数据库等读取)。这很快变得无法扩展,除非我完全错过了一些东西。
我想过做一个非类型模板类作为策略。
template<int N>
struct ApplicationPolicy
{
int policy = N;
};
Profile<ApplicationPolicy<1>> allowed;
Profile<ApplicationPolicy<0>> prohibited;
我认为这确实适用于我的情况,但我想知道这是否缺少基于策略的设计的要点。我在看到这一点的优点时遇到了问题,只是让 Profile 成为一个正常的结构,并根据需要将它的数据成员设置为 true/false。
想法?