Một hàm có tên test
mất tiêu chuẩn :: function <> làm tham số của nó.C++ 11 variadic std :: tham số chức năng
template<typename R, typename ...A>
void test(std::function<R(A...)> f)
{
// ...
}
Nhưng, nếu tôi làm như sau:
void foo(int n) { /* ... */ }
// ...
test(foo);
Compiler (gcc 4.6.1) nói no matching function for call to test(void (&)(int))
.
Để làm dòng cuối cùng test(foo)
biên dịch và hoạt động bình thường, làm cách nào tôi có thể sửa đổi chức năng test()
? Trong chức năng test()
, tôi cần f
với loại std :: function <>.
Ý tôi là, có bất kỳ thủ thuật mẫu nào để cho trình biên dịch xác định chữ ký của hàm (ví dụ: foo
) và tự động chuyển đổi thành std::function<void(int)>
không?
CHỈNH SỬA
Tôi muốn thực hiện công việc này cho lambdas (cả được nêu và không quốc tịch).
gì về lambdas (cả nói và không quốc tịch)? –
@Daniel bạn đã hết may mắn. Hoặc làm cho 'test' một mẫu chấp nhận bất cứ điều gì (' T'). 'std :: function' sẽ không loại bỏ các đối tượng hàm không tương thích hoàn toàn, vì vậy mục tiêu giới hạn kiểu tham số của hàm mẫu có vẻ không hữu ích đối với tôi ở đây. –
Tôi đã thử với '(T)', nhưng, làm thế nào nó có thể được thực hiện cho 'std :: function'? Có vẻ như tôi có thể nhận được 'R' bằng cách sử dụng' std :: result_of <> ', nhưng' A ... '? –