Вы можете использовать тот факт, что для созданных экземпляров функций и шаблонных сущностей, которые они включают, есть свои собственные копии статических переменных, определенных в функции.Превращение make_lambda
в шаблон ...
template<int>
static auto make_lambda(){
return [](){
static auto count = 0;
return count++;
};
}
... создаст новую статическую переменную для каждого нового аргумента шаблона, уникальную для TU (поскольку сам шаблон функции равен static
):
auto a = make_lambda<0>();
auto b = make_lambda<1>();
std::cout << &a << ", " << a() << std::endl;
std::cout << &b << ", " << b() << std::endl;
Это не совсем тот синтаксис, который вы хотели, но он выполняет свою работу.Если вы не возражаете против использования препроцессора и, возможно, расширений компилятора, вы можете получить простой синтаксис вызова функции с помощью вспомогательного макроса.
#define make_lambda() make_lambda<__COUNTER__>()
где __COUNTER__
- расширение GCC, которое расширяется до нового числакаждый раз требуется расширение в любом отдельном TU.