Как можно архивировать то же самое с помощью вышеприведенной лямбды?
Вы не можете.Вы должны всегда объявлять тип переменной.Если вы определяете лямбду после объявления переменной, тогда объявленный тип не может быть выведен из инициализатора.Но вы не можете ссылаться на тип лямбда-выражения до того, как он был определен, потому что тип является анонимным.
Вместо лямбда-выражения (т. Е. Объекта анонимной функции) вы можете просто использовать функциональный объект именованного типа.,Затем вы можете разделить определение функции.Кроме того, вы должны объявить тип возвращаемого значения функции, поскольку он не может быть выведен без определения функции:
class A final {
constexpr struct Foo {
template<class Param1, class Param2, class Param3>
void operator()(Param1&, Param2&, Param3&) const;
} foo{};
};
Однако, как вы можете заметить, функция на самом деле является шаблоном функции.Это потому, что вы используете auto
аргументы в лямбда-выражении.Если вы хотите определить шаблон вне заголовка, то вы должны ограничить экземпляры ограниченным набором и явно создать экземпляры, для которых определен шаблон:
// the definition
template<class Param1, class Param2, class Param3>
void A::Foo::operator()(Param1&, Param2&, Param3&) const {
// do stuff
return;
}
// explicit instantiations
template void A::Foo::operator()<int, int, int>(int&, int&, int&) const;
template void A::Foo::operator()<int, double, float>(int&, double&, float&) const;
Если вы попытаетесь вызвать с аргументами, у которых нетне было создано, в модуле перевода, где шаблон не определен, возникнет ошибка компоновщика.
Если вы хотите оставить аргументы без ограничений, то у вас конфликтующие требования.Неограниченные шаблоны могут быть достигнуты только путем определения шаблона в заголовке.
С другой стороны, вы можете решить, нужен ли вам в первую очередь функциональный объект.Вы не продемонстрировали свою потребность в этом.Приведенный выше пример работает так же хорошо, если бы вы сделали его статической функцией-членом (шаблоном) вместо функционального объекта.