C++ - 可变参数函数的多个参数包

标签 c++ c++17 variadic-templates

我对 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)

因为你的模板函数正在等待

  1. 类型参数 ( T ),

  2. 模板-模板参数 ( TUnused )

以及传递时的其他模板参数

  1. 类型参数 ( boost::asio::io_context )

  2. 另一个类型模板参数 ( 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);   
 }

哪里Tstd::string (第一个显式模板参数),TDependencies...short, int, long, long long (以下显式模板参数)和 TArgs...int, long, long long (从 0, 1l, 2ll 参数推导出来)。

请注意,您不需要 TUnused模板参数。

关于C++ - 可变参数函数的多个参数包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63179866/

相关文章:

c++ - C++中 "free function"这个词是什么意思?

c++ - 对std::vector使用嵌套的[]操作

c++ - 带有重载转换函数的 std::transform

具有默认值的 C++ 可变参数模板函数参数

c++ - std::async 不使用 std::launch::async 策略启动新线程

c++ - 这是否是一个错过的优化机会

c++ - 如何将 lambda 与模板化 std::unique_ptr 一起使用?

c++ - 使用 Clion 的 C++ 简单程序 "expected ` ,' or ` .. .' before ' & &' token"

c++ - 查找要合并的一组包以等于给定的包

c++ - 具有自动返回类型参数推导的可变参数模板