Tôi muốn gọi phương thức từ phương thức khác, thông qua chức năng của bên thứ ba; nhưng cả hai đều sử dụng các mẫu variadic. Ví dụ:Làm thế nào để kết hợp std :: bind(), mẫu variadic và chuyển tiếp hoàn hảo?
void third_party(int n, std::function<void(int)> f)
{
f(n);
}
struct foo
{
template <typename... Args>
void invoke(int n, Args&&... args)
{
auto bound = std::bind(&foo::invoke_impl<Args...>, this,
std::placeholders::_1, std::forward<Args>(args)...);
third_party(n, bound);
}
template <typename... Args>
void invoke_impl(int, Args&&...)
{
}
};
foo f;
f.invoke(1, 2);
Vấn đề là, tôi nhận được một lỗi biên dịch:
/usr/include/c++/4.7/functional:1206:35: error: cannot bind ‘int’ lvalue to ‘int&&’
tôi đã cố gắng sử dụng một lambda, nhưng maybe GCC 4.8 không xử lý các cú pháp được nêu ra; đây là những gì tôi đã cố gắng:
auto bound = [this, &args...] (int k) { invoke_impl(k, std::foward<Args>(args)...); };
tôi nhận được lỗi sau:
error: expected ‘,’ before ‘...’ token
error: expected identifier before ‘...’ token
error: parameter packs not expanded with ‘...’:
note: ‘args’
Từ những gì tôi hiểu, trình biên dịch muốn nhanh chóng invoke_impl
với loại int&&
, trong khi tôi nghĩ rằng việc sử dụng &&
trong trường hợp này sẽ bảo toàn loại đối số thực tế.
Tôi đang làm gì sai? Cảm ơn,
GCC 4.8 xử lý cú pháp một cách hoàn hảo. Bạn đã thử gì? –
@ArneMertz Tôi đã cập nhật câu hỏi với cú pháp tôi đã thử – piwi
có vẻ như bạn vừa gặp lỗi trong gcc, nó sẽ hoạt động: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41934 –