函数调用中的多个圆括号

More than one round bracket in function call?

本文关键字:圆括号 函数调用      更新时间:2023-10-16

我有一个练习,我需要写一个函数。函数方案看起来像

auto add(int a){
}

我需要能够用许多括号调用这个函数:

add(1)(2)(3); // 6
add(1)(2)(3)(4); // 10
add(1)(2)(3)(4)(5); // 15

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

你可以通过

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;
}

在此示例中,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 ----------^

这是另一个示例,其中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 ----------^

显式构造函数

如果您希望explicit adder的构造函数,您还必须稍微更改 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);
}

我想到的唯一解决方案是将此"添加"作为带有重载括号运算符的某个类对象,它将返回新对象,然后从中调用新括号,但您需要以某种方式从中返回最终值,就像一些 getter func 一样。

class Adder{
private:
    int value;
public:
    Adder():value(0){}
    Adder(int a):value(a){}
    int get(){return value;}
    Adder operator() (int a) {
        return Adder(value+a);
    }
};

但这似乎没有用,可能有更好的方法来完成你想要得到的东西。