【发布时间】:2021-09-04 21:44:37
【问题描述】:
我正在尝试在 C++ 中创建一个自动解决依赖关系的 IoC 容器。
为此,我创建了一个带有两个可变参数包的函数,声明如下:
template <class T, typename ... TDependencies, typename... TArgs>
void Register(std::function<std::shared_ptr<T> (std::shared_ptr<TDependencies> ...,
TArgs ...)> && pFactory)
显然,编译器在提供时似乎无法匹配
Register<Foo, Bar>(std::function<std::shared_ptr<Foo>(std::shared_ptr<Bar>)>(
[](std::shared_ptr<Bar> bar){return std::make_shared<Foo>(bar);}));
编译错误说
note: candidate: 'void Container::Register(std::function<std::shared_ptr<_Tp>
(std::shared_ptr<TDependencies>..., TArgs ...)>&&)
[with T = Foo; TDependencies = {Bar}; TArgs = {std::shared_ptr<Bar>}]'
显然,它匹配std::shared_ptr<Bar> 两次。如何让编译器不匹配 TArgs 中的shared_ptr?
【问题讨论】:
-
std::shared_ptr<T (std::shared应该是std::shared_ptr<T>(std::shared? -
是的,我复制的时候搞砸了。感谢您指出这一点
-
您能否将您的代码格式化为最多 80 个字符。您的大部分代码都是隐藏的,必须在两个实例上水平滚动非常繁琐且难以阅读。
-
如果任何参数本身是共享指针,则函数签名不明确。
-
@Quimby 但为什么呢?什么规则阻止此模板明确地将
TArgs...匹配为空包?
标签: c++ c++17 variadic-templates