Я запутался в пересылке ссылок на юниверсы в шаблонах. Мой код выглядит следующим образом:
class A {
public:
void fn(std::unique_ptr<std::string> n) {
(*n) += "1";
cout << "n: " << *n << endl;
}
void fn2(std::string& n) {
n += "2";
cout << "n: " << n << endl;
}
};
template <typename Func, typename Class, typename... Args>
std::thread create_thread(Func&& func, Class* this_ptr, Args&&... args) {
auto handler = [&] {
(this_ptr->*func)(std::forward<Args>(args)...); // error
};
return std::thread(handler);
}
int main() {
auto str1 = std::make_unique<std::string>("a");
auto str2 = "b";
A a;
auto t1 = create_thread(&A::fn, &a, std::move(str1));
auto t2 = create_thread(&A::fn2, &a, std::ref(str2));
t1.join();
t2.join();
return 0;
}
error: cannot bind non-const lvalue reference of type ‘std::basic_string<char>&’ to an rvalue of type ‘std::basic_string<char>’
Я также попытался std::forward(args...)
вместо этого, поскольку C ++ 17 может автоматически получать тип шаблона. Также не сработало (не подходит для std::forward
?).
Так как переадресовать ссылку на правое и левое значения в одной шаблонной функции? Заранее спасибо.