Используя std::function
, мы можем получить тип аргумента с использованием typedefs argument_type
, second_argument_type
и т.д., но я не вижу способа сделать то же самое с lambdas. Является ли это возможным? (Я использую VS2010)
Скажем, я хочу, чтобы в моей системе десериализации, используемой для чтения объекта, и для передачи его в функцию 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);
}
Его можно использовать как это, и все работает нормально:
std::function<void(int)> f = [](int i) -> void { setValue(i); };
forward(f);
Но он не будет работать напрямую с lambdas:
forward([](int i) -> void { setValue(i); });
//error C2039: 'argument_type' : is not a
//member of '`anonymous-namespace'::<lambda1>'
Есть ли способ доступа к типам параметров таким образом, который будет работать как для объектов lambdas, так и для std::function
? Может быть, способ сначала получить тип std::function
лямбда, а затем argument_type
от этого?
Следуя приведенному ниже ответу, версия, которая работает с lambdas и std::function
, выглядит так:
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); });
Так как int
повторяется здесь, я надеялся избавиться от него - не так уж плохо для int
, но более раздражает для длинноименованных типов в нескольких пространствах имен. C'est la vie!