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的直接函数调用,它可以解决这个问题,因为函数调用机制知道候选重载是什么,但这种"分解"结构的情况并非如此。

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

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

但是,我建议您只通过(并接受(std::vector<std::string_view>。这会更容易,也更简单。

std::thread接收到一个可调用的作为第一个参数,您将其发送给void(myNameSpace::functionName的调用结果(。

你需要做的是

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

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

对于线程,您需要在参数列表中提供函数引用和参数参数,如下所示:

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

在您的情况下,您必须提供以下论据:

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

最新更新