template<typename T>
class Adder
{
public:
    T operator() (const T & a,const T & b)
    {
        return a + b;
    }
};
auto Add(const int a, const int b)->int {
    return a + b;
}
auto Add2 = [](const int a, const int b)-> int {
    return a + b;
};
int main()
{
    class {public: int operator ()(const int a, const int b) { return a + b; }} d;
    auto a = Adder<int>{};
    auto b = [](const int a, const int b)->int
    {
        return a + b;
    };
    std::cout << "5 + 1 = " << a(5, 1) << std::endl;
    std::cout << "5 + 1 = " << b(5, 1) << std::endl;
    std::cout << "5 + 1 = " << Add(5, 1) << std::endl;
    std::cout << "5 + 1 = " << Add2(5, 1) << std::endl;
}


비슷비슷, d가 제일 더러운 듯