A ja wysmażyłem coś takiego (fold expressions for the win):
#include <iostream>
auto sum() {
return []<typename ...Args>(Args&&... args){return (args + ...);};
}
int main() {
std::cout << sum()(1, 2, 3, 4) << std::endl;
}
$ g++ test.cpp -o test -std=c++17
$ ./test
10
Z parametrem to
#include <iostream>
template <class T>
auto sum(T i) {
return [i]<typename ...Args>(Args&&... args){return (args + ... + i);};
}
int main() {
std::cout << sum(10)(1, 2, 3, 4) << std::endl;
}
$ g++ test.cpp -o test -std=c++17
$ ./test
20
Albo na całego:
#include <iostream>
template <class ...T>
auto sum(T&&... t) {
return [t...]<typename ...Args>(Args&&... args){return (args + ... + (t + ...));};
}
int main() {
std::cout << sum(10, 10, 10)(1, 2, 3, 4) << std::endl;
}
$ g++ test.cpp -o test -std=c++17
$ ./test
40