当前位置: 首页 > 知识库问答 >
问题:

将具有可变模板参数的成员函数传递给可变构造函数

鲁文昌
2023-03-14
class Test
{
public:
    template<typename Function, typename... Args>
    void Run(Function&& f, Args&&... args)
    {
        std::thread t(&Test::Operation, this, f, args...); // how???
        t.detach();
    }

    template<typename Function, typename... Args>
    void Operation(Function&& f, Args&&... args)
    {
        f(args...);
    }
};

Test test;
test.Run([](const std::string& msg) { std::cout << msg; }, "Hi!");

以这种方式传递参数有问题,我得到以下错误:“std::thread::thread”:没有重载函数接受4个参数。我怎么能这么做?

共有1个答案

丁光华
2023-03-14

这里的问题是,当您将&test::operation传递给线程构造函数时,它无法推导出&test::operation的模板参数。(如果你想理解为什么这个推导不能完成,你可能应该另外问一个问题。)关键是您需要显式指定&test::operation的模板参数。

这将如下所示:

template<typename Function, typename... Args>
void Run(Function&& f, Args&&... args)
{
    std::thread t(&Test::Operation<std::decay_t<Function>, std::decay_t<Args>...>,
                  this, std::forward<Function>(f), std::forward<Args>(args)...);
    t.detach();
}

我为你添加了完美转发:这很重要,因为你不想执行不必要的复制,对吗?

 类似资料:
  • 我有两个变量类成员函数。当第一个被调用时,我想创建一个std::function到第二个类成员函数,然后将的参数绑定到函数指针。 所以稍后我可以调用,而不必将所有参数传递给 我想避免使它成为模板类,并将参数存储在元组中。 我试图让以下示例起作用: 链接到live示例:http://cpp.sh/4ylm 当我编译时,我得到一个错误 模板参数推断/替换失败:17:37: 注意:无法推断模板参数“\u

  • 问题内容: 为了不重复我的自我,我想创建一个函数来处理一些命令。 一旦我尝试运行它,我得到以下错误: 我研究了的实现,并且看起来函数签名正是我提供的。 在内部a 应该与可变参数相同,但对于编译器来说似乎不一样。 有没有办法将可变参数传递给? 问题答案: 您用另一个扩展 从语言规范的传递参数…参数 如果最终参数可分配给切片类型,则在参数后跟时可以将其作为参数的值原样传递。在这种情况下,不会创建新的切

  • 请考虑以下定义和演绎指南: 如果我尝试使用显式模板参数实例化 ,代码将正确编译: 如果我试图通过演绎指南实例化< code>foo... > G7产生编译器错误: clang 5 爆炸: wandbox上的实例 虽然clang肯定被窃听了(报告为问题#32673),但g拒绝我的代码是正确的吗?我的代码格式错误吗?

  • 问题内容: 与在或中使用的方式类似: 问题答案: 是。 如果你不理会关键字参数,这很简单并且可以工作: 如你所见,Python将为你提供一个包含所有参数的元组。 对于关键字参数,你需要将其作为单独的实际参数接受,如的所示。

  • 问题内容: 我有一个PHP函数,该函数需要可变数量的参数(使用和),但是我要传递给该函数的参数数量取决于数组的长度。有没有一种方法可以使用可变数量的参数来 调用 PHP函数? 问题答案: 如果参数在数组中,则该函数可能会对您有兴趣。 如果您要传递的参数数量取决于数组的长度,则可能意味着您可以将它们自己打包到数组中-并将其用于第二个参数。 然后,您传递给该数组的元素将作为不同的参数被函数接收。 例如

  • 在Swift编程语言中,它说: 函数也可以接受可变数目的参数,将它们收集到数组中。 当我用逗号分隔的数字列表(`sumof(1,2,3,4)调用这样一个函数时,它们在函数中作为一个数组可用。 问题:如果我已经有一个数组要传递给这个函数,该怎么办? 这将失败,并出现编译器错误,“无法找到接受所提供参数的'__conversion'的重载”。有没有办法把一个现有的数组变成一个我可以传递给一个变量函数的