Что фактический тип f
? поэтому я могу объявить вектор этого типа?
Тип f
может быть выведен только с помощью auto
. Вы можете объявить vector
этого типа с использованием
std::vector<decltype(f)> v;
Однако, это не очень полезно. Лямбда-функции, которые кажутся поразительно похожими, имеют разные типы. Хуже того, функции лямбда, имеющие одинаковое тело, также имеют разные типы.
auto f = [] (std::string msg) -> void {
std::cout << msg << std::endl;
};
auto g = [] (std::string msg) -> void {
std::cout << msg << std::endl;
};
auto h = [] (std::string msg) -> void {
std::cout << msg << '+' << msg << std::endl;
};
Учитывая вышеперечисленные функции, вы не можете использовать
std::vector<decltype(f)> v;
v.push_back(f); // OK
v.push_back(g); // Not OK
v.push_back(h); // Not OK
Ваш лучший вариант заключается в создании std::vector
из std::function
с. Вы можете добавить лямбда-функции к этому std::vector
. С учетом приведенных выше определений f
и g
, вы можете использовать:
std::vector<std::function<void(std::string)>> v;
v.push_back(f);
v.push_back(g);
v.push_back(h);
"* Что фактический тип F *?" Unnameable. "*, поэтому я могу объявить вектор этого типа? *« Да, но это не помогло, потому что lambdas не являются стандартными по умолчанию. 'std :: vector>' вероятно, подойдет вашим целям. –
ildjarn
вы действительно можете использовать указатели, если лямбда не имеет замыканий, btw – vu1p3n0x
Если вам не нужен вектор (т. Е. Если фактические лямбды известны во время компиляции), вы можете создать std :: tuple lambdas. – dats