在创建基于 class 的策略时,如何将模板参数转发到 std::make_unique?
how do I forward the templates arguments onto the std::make_unique when creating policy based class?
假设我正在使用基于策略的模板设计模式(参见https://en.wikipedia.org/wiki/Modern_C%2B%2B_Design)。
我遇到了一些与如何使用 std::make_shared(或 std::make_unique 就此而言)用于创建新类型 Bar,它有一些可选的模板参数。
如果我不想更改默认策略,那没问题,简单的行就可以了:
auto bar = std::make_unique<Bar>();
但是,如果我希望 Bar 接受不同的“策略”作为模板参数,我该如何将它们传递给 std::make_unique ??
尝试了以下方法(没有成功):
auto bar = std::make_unique<Bar<Policy2, Policy3>>();
或:
auto bar = std::make_unique<Bar>(Policy2, Policy3);
下面是一些示例代码来演示问题:
// Bar.hpp
template<PolicyConcept1 T = policy1_default, PolicyConcept2 V = policy2_default>
class Bar
{
public:
Bar();
private:
// Data Members
std::unique_ptr<T> _policy1;
std::unique_ptr<V> _policy2;
};
// bar.cpp
#include "bar.hpp"
template<PolicyConcept1 T, PolicyConcept2 V>
Bar<T, V>::Bar() :
_policy1{ std::make_unique<T>() },
_policy2{ std::make_unique<V>()}
{
}
// Foo.hpp
template<PolicyConcept1 T = policy1_default, PolicyConcept2 V = policy2_default>
class Foo
{
public:
Foo();
private:
// Data Members
std::unique_ptr<Bar> _bar;
};
#include "Foo.hpp"
template<PolicyConcept1 T, PolicyConcept2 V>
Foo<T, V>::Foo() :
// problem is here, how do I change the default policy and forward it into std::make_unique ??
_bar{ std::make_unique<bar>() }
{
}
问题出在 Foo CTOR 的初始值设定项中:
如何将 T & V 模板参数转发到 std::make_unique ??
感谢任何帮助:)
想通了。
结果是语法:
auto bar = std::make_unique<Bar<Policy2, Policy3>>();
毕竟可以工作(在 C++20 上,使用 MSVC v16.10.2)。
需要以下声明才能工作:
std::unique_ptr<Bar<T,V>> _bar;
此外,我还必须在 CPP 上提供这个(以避免链接器错误):
template class Bar<concrete_policy1, concrete_policy2>;
假设我正在使用基于策略的模板设计模式(参见https://en.wikipedia.org/wiki/Modern_C%2B%2B_Design)。
我遇到了一些与如何使用 std::make_shared(或 std::make_unique 就此而言)用于创建新类型 Bar,它有一些可选的模板参数。
如果我不想更改默认策略,那没问题,简单的行就可以了:
auto bar = std::make_unique<Bar>();
但是,如果我希望 Bar 接受不同的“策略”作为模板参数,我该如何将它们传递给 std::make_unique ??
尝试了以下方法(没有成功):
auto bar = std::make_unique<Bar<Policy2, Policy3>>();
或:
auto bar = std::make_unique<Bar>(Policy2, Policy3);
下面是一些示例代码来演示问题:
// Bar.hpp
template<PolicyConcept1 T = policy1_default, PolicyConcept2 V = policy2_default>
class Bar
{
public:
Bar();
private:
// Data Members
std::unique_ptr<T> _policy1;
std::unique_ptr<V> _policy2;
};
// bar.cpp
#include "bar.hpp"
template<PolicyConcept1 T, PolicyConcept2 V>
Bar<T, V>::Bar() :
_policy1{ std::make_unique<T>() },
_policy2{ std::make_unique<V>()}
{
}
// Foo.hpp
template<PolicyConcept1 T = policy1_default, PolicyConcept2 V = policy2_default>
class Foo
{
public:
Foo();
private:
// Data Members
std::unique_ptr<Bar> _bar;
};
#include "Foo.hpp"
template<PolicyConcept1 T, PolicyConcept2 V>
Foo<T, V>::Foo() :
// problem is here, how do I change the default policy and forward it into std::make_unique ??
_bar{ std::make_unique<bar>() }
{
}
问题出在 Foo CTOR 的初始值设定项中: 如何将 T & V 模板参数转发到 std::make_unique ??
感谢任何帮助:)
想通了。 结果是语法:
auto bar = std::make_unique<Bar<Policy2, Policy3>>();
毕竟可以工作(在 C++20 上,使用 MSVC v16.10.2)。
需要以下声明才能工作:
std::unique_ptr<Bar<T,V>> _bar;
此外,我还必须在 CPP 上提供这个(以避免链接器错误):
template class Bar<concrete_policy1, concrete_policy2>;