У лямбда-функции есть подпись, чтобы я мог их пропустить?
template<class Fn>
HRESULT foreach(Fn _fuction)
{
}
object->foreach(
[param1, param2] (int item)
{
}
);
object->foreach(
[param1, param2, param3] (int item)
{
}
);
Я хочу использовать функцию typedef вместо шаблонов, я думаю, что тип функции будет строгать формальные параметры, но позволит перехватить список.
могу ли я использовать typedef вместо шаблонов для прохождения лямбда-функций?
что-то вроде:
typedef void (*Fn)(int);
но позволяет лямбда не работать с указателем.
Я попытался использовать std :: fuction, но, похоже, не работает.
Тип лямбда-выражения (который также является типом объекта замыкания) является уникальным, неименованным non- классом типа union - называется типом замыкания...
(С++ 11 §5.1.2/3, акцент мой)
Мое прочтение этого состоит в том, что даже если два лямбда-выражения имеют один и тот же список параметров, тип возврата и список захвата, они тем не менее имеют разные типы.
auto f = []{};
typedef decltype(f) lambda_type;
void g(lambda_type lambda) { lambda(); }
int main() {
g(f); // OK
g([]{}); // error: type mismatch
}
Так что нет, то, что вы пытаетесь сделать, не может быть сделано. Как предложили другие, попробуйте использовать std::function
или сохраните шаблон (что не так с шаблонами, так или иначе?)
Фактический тип лямбда не указан. Но они конвертируемы к function
; в вашем случае std::function<void(int)>
(void
- это тип возвращаемого значения, типы параметров идут в круглые скобки).
<functional>
function
возникают некоторые накладные расходы.