繁体   English   中英

带有 std::thread 的 std::initializer_list

[英]std::initializer_list with std::thread

myNameSpace::functionName(this, {"abc", "abc1"});  // working fine

工作正常,但是

std::thread(myNameSpace::functionName<ClassName>(this, {"abc", "abc1"})); 
                     //error: invalid use of void expression.

请建议我在这里缺少什么。 或者怎么做。

namespace myNameSpace {
    template<typename T>
    void functionName(T* cm, std::initializer_list<std::string_view> args) { ... }
}

首先,这不是您启动线程的方式。 您正在调用它,并将结果作为参数传递以启动线程。 但是, void不是启动线程的有效参数,在任何意义上它也不是任何有用的表达式。

你会写这样的东西:

std::thread(&myNameSpace::functionName<ClassName>, this, {"abc", "abc1"});

您的下一个问题是,编译器无法在语言中推断出您所说的{"abc", "abc1"}的含义。 通过对functionName的直接 function 调用,它可以解决,因为 function 调用机制知道候选重载是什么,但这种“分解”结构并非如此。

可以通过指定类型来解决这个问题

std::thread(&myNameSpace::functionName<ClassName>, this, std::initializer_list<std::string_view>{"abc", "abc1"});

但是,我建议您只传递(并接受)一个std::vector<std::string_view> 它会容易得多,简单得多。

std::thread接收可调用作为第一个参数,您将其发送为voidmyNameSpace::functionName的调用结果)。

你需要做的是

std::thread(myNameSpace::functionName<ClassName>, this, std::initializer_list<std::string_view>({"abc", "abc1"})));

请注意,需要显式转换为std::initializer_list ,因为std::initializer_list是不可扣除的类型。

对于线程,您需要在 arguments 列表中提供 function 参考和 arguments 参数,如下所示:

template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );

在您的情况下,您必须提供 arguments,如下所示:

std::thread(myNameSpace::functionName<ClassName>,this, std::initializer_list<std::string_view>({"abc", "abc1"})); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM