gpt4 book ai didi

带有参数的 C++ 模板策略

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:02:14 25 4
gpt4 key购买 nike

我是新手。我正在创建一个包含政策的类(class):

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> >

但是当它们运行时,我不确定提供策略类对象的最佳方式是什么……或者这不再是一种策略模式?

最佳答案

您可以为该政策设置一个工厂 :) 编辑 请参阅下面添加的内容

或者你可以像标准库那样做:

#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"));

查看 Live on Coliru


更新:工厂

这是显示工厂方法的更新:

#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 *

注意

  • 我更喜欢构造函数传入方法
  • 工厂在技术上是一个trait

关于带有参数的 C++ 模板策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20960024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com