Sử dụng std::function
, chúng tôi có thể nhận loại đối số bằng cách sử dụng các kiểu gõ argument_type
, second_argument_type
, v.v., nhưng tôi không thể thấy cách làm điều tương tự với lambdas. Có thể không? (Tôi đang sử dụng VS2010)Chúng ta có thể lấy kiểu đối số lambda không?
Nói rằng tôi muốn một cái gì đó như sau trong hệ thống deserialization tôi sử dụng để đọc một đối tượng và vượt qua nó để một hàm setter:
template<typename F>
static void forward(F f)
{
// Create an object of the type of the first
// parameter to the function object F
typedef typename F::argument_type T;
T t;
//...do something with 't' here (deserialize in my case)
// Forward the object to the function
f(t);
}
Nó có thể được sử dụng như thế này và tất cả mọi thứ hoạt động tốt:
std::function<void(int)> f = [](int i) -> void { setValue(i); };
forward(f);
Nhưng nó sẽ không làm việc trực tiếp với lambdas:
forward([](int i) -> void { setValue(i); });
//error C2039: 'argument_type' : is not a
//member of '`anonymous-namespace'::<lambda1>'
Có cách nào để truy cập các kiểu tham số theo cách sẽ hoạt động đối với cả hai đối tượng lambdas và std::function
? Có lẽ một cách để có được loại std::function
của một lambda đầu tiên, và sau đó là argument_type
từ đó?
Tiếp theo từ câu trả lời dưới đây, một phiên bản làm việc với lambdas và std::function
là:
template<typename T, typename F>
static void forward(F f)
{
T t;
//...do something with 't' here (deserialize in my case)
f(t);
}
forward<int>([](int i) -> void { setValue(i); });
Kể từ int
được lặp lại ở đây tôi đã hy vọng để thoát khỏi nó - không đến nỗi tệ cho int
nhưng khó chịu hơn đối với các loại có tên dài trong một vài không gian tên. C'est la vie!
Câu trả lời ngắn gọn: không. – ildjarn
Câu trả lời dài: yup, xem bên dưới. –