函数调用中有多个圆括号?

jer*_*rry 5 c++ currying c++11 c++14

我有一个练习,我需要编写一个函数.功能方案看起来像

auto add(int a){
}
Run Code Online (Sandbox Code Playgroud)

我需要能够使用许多括号调用此函数:

add(1)(2)(3); // 6
add(1)(2)(3)(4); // 10
add(1)(2)(3)(4)(5); // 15
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚在这种情况下我应该使用哪种C++功能.我听说我应该使用仿函数,但我不知道在这种情况下这是不是最好的主意.

Jon*_*nas 17

你可以通过add返回一个仿函数,即一个实现的对象来做到这一点operator().您可以编写一个模板化版本,让编译器推断出类型.在这里试试吧.

template <class T>
struct adder 
{
    T val;

    adder(T a) : val(a) {}

    template <class T2>
    auto operator()(T2 a) -> adder<decltype(val + a)> { return val + a; }

    operator T() const { return val; }
};

template <class T>
adder<T> add(T a)
{
    return a;
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,T最终会解决double:

std::cout << add(1)(2.5)(3.1f)(4) << std::endl;
// T is int -----^
// T is double ------^
// T is still double -----^
// T is still double ----------^
Run Code Online (Sandbox Code Playgroud)

这是另一个T解决方案double:

std::cout << add(1)(2.5f)(3.1)(4) << std::endl;
// T is int -----^
// T is float -------^
// T is double ------------^
// T is still double ----------^
Run Code Online (Sandbox Code Playgroud)

显式构造函数

如果你想的构造adderexplicit你还需要稍微改变return语句.

template <class T>
struct adder 
{
    T val;

    explicit adder(T a) : val(a) {}

    template <class T2>
    auto operator()(T2 a) -> adder<decltype(val + a)>
    {
        return adder<decltype(val + a)>(val + a);
    }

    operator T() const { return val; }
};

template <class T>
adder<T> add(T a)
{
    return adder<T>(a);
}
Run Code Online (Sandbox Code Playgroud)