我是新手。我正在创建一个政策说:
template <typename T,
typename P1 = Policy1<T>,
typename P2 = Policy2<T> >
{
...
}
我遇到的问题是某些策略有参数,当它们是编译时它是可以的
template <typename T,
typename P1 = Policy1<T, size_t N>,
typename P2 = Policy2<T> >
但是当它们是运行时时我不确定提供策略类对象的最佳方式是什么......或者这不再是策略模式?
答案 0 :(得分:9)
您可以为该政策设立工厂:) 编辑请参阅下面添加的
你可以像标准库那样做:
#include <string>
struct DummyPolicy { };
template <typename>
struct Policy1 { Policy1(int, std::string) { } };
template <typename T,
typename P1 = Policy1<T> >
struct X
{
X(P1 p1 = {}) : _policy1(std::move(p1)) { }
private:
P1 _policy1;
};
并使用它
int main()
{
X<int, DummyPolicy> no_questions_asked;
X<int> use_params({42, "hello world"});
}
使用C ++ 03或显式构造函数显然可以拼写出来:
X<int> use_params(Policy1<int>(42, "hello world"));
以下是显示工厂方法的更新:
#include <string>
namespace details
{
template <typename PolicyImpl>
struct PolicyFactory
{
static PolicyImpl Create() {
return {};
}
};
}
template <typename>
struct Policy2 { Policy2(double) { } };
template <typename T,
typename P1 = Policy2<T> >
struct X
{
X() : _policy1(details::PolicyFactory<P1>::Create()) {}
X(P1 p1) : _policy1(std::move(p1)) { }
private:
P1 _policy1;
};
///// supply a factor, possibly local to a TU:
namespace details
{
template <typename T>
struct PolicyFactory<Policy2<T> > {
static Policy2<T> Create() {
return Policy2<T>(3.14);
}
};
}
int main()
{
// with a factory:
X<std::string, Policy2<std::string> > no_params_because_of_factory;
}
查看 Live on Coliru *
请注意
答案 1 :(得分:5)
模板中的策略用于在编译时自定义类,而不是在运行时(策略形成实例的类型,并且在C ++中无法在运行时决定类型)。
运行时并行通常称为“依赖注入”,例如,通过传递实例将委派操作的已构造对象。