我对 C++ 很陌生,对于我的第一个项目,我尝试编写一个 ioc 容器来扩展 this blog post 中描述的概念。通过向注册函数添加可变参数。因此,一个参数包将用于可变参数,另一个参数包用于声明要注册的类型的依赖关系。
读了一会儿之后,我发现了与我最终尝试做的类似的东西。该函数如下所示:
template <class T,
template<typename ...TDependencies> typename TUnused, typename... TDependencies,
typename ...TArgs>
void RegisterSingletonClassFactory(TArgs...args)
{
std::string typeKey = typeid(T).name();
creatorMap_[typeKey] = [this, args...](){
return new T(GetInstance<TDependencies>()..., args...);
};
std::shared_ptr<IHolder> iHolder = instanceMap_[typeKey];
auto * holder = dynamic_cast<Holder<T>*>(iHolder.get());
if(holder != nullptr)
holder->instance_ = nullptr;
}
我用 iocContainer_.RegisterSingletonClassFactory<boost::asio::io_context, std::tuple<>>(30);
来调用它.
然而,这给了我错误“错误:没有匹配的调用函数”...clang告诉我“忽略了候选模板:模板参数的显式指定参数无效” TUnused'”。
有办法做到这一点吗?该错误到底意味着什么?
谢谢
最佳答案
And what exactly does the error mean?
该错误意味着您的调用
iocContainer_.RegisterSingletonClassFactory<boost::asio::io_context, std::tuple<>>(30);
与模板函数的声明不匹配
template <class T,
template<typename ...TDependencies> typename TUnused, typename... TDependencies,
typename ...TArgs>
void RegisterSingletonClassFactory(TArgs...args)
因为你的模板函数正在等待
类型参数 (
T
),模板-模板参数 (
TUnused
)
以及传递时的其他模板参数
类型参数 (
boost::asio::io_context
)另一个类型模板参数 (
std::tuple<>
)
如果你想通过std::tuple
作为模板-模板参数,您必须在没有模板参数的情况下传递它( std::tuple
,而不是 std::tuple<>
)。
鉴于您的 TUnused
参数是...好吧,未使用,...我想您的意图是将其用作类型容器。
但是没有必要。
不确定,但在我看来,您正在寻找类似的东西
template <typename T, typename... TDependencies, typename ...TArgs>
void foo (TArgs...args)
所以你可以显式T
和一个(可能是空的)TDependecies...
类型列表。
TArgs...
列表是从参数推导出来的
以下是一个愚蠢但可编译的 C++17 示例
#include <iostream>
template <typename T, typename... TDependencies, typename ...TArgs>
void foo (TArgs...args)
{
std::cout << "T:" << typeid(T).name() << std::endl;
std::cout << "TDependecies list:" << std::endl;
((std::cout << "- " << typeid(TDependencies).name() << std::endl), ...);
std::cout << "TArgs list:" << std::endl;
((std::cout << "- " << typeid(TArgs).name() << std::endl), ...);
}
int main()
{
foo<std::string, short, int, long, long long>(0, 1l, 2ll);
}
哪里T
是 std::string
(第一个显式模板参数),TDependencies...
是 short, int, long, long long
(以下显式模板参数)和 TArgs...
是 int, long, long long
(从 0, 1l, 2ll
参数推导出来)。
请注意,您不需要 TUnused
模板参数。
关于C++ - 可变参数函数的多个参数包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63179866/