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

时间:2017-05-24 07:01:46

标签: c++ c++11 c++14 currying

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

auto add(int a){
}

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

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

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

2 个答案:

答案 0 :(得分:17)

您可以让add返回functor,即实现operator()的对象。您可以编写一个模板化版本,让编译器推断出类型。试一试here

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 ----------^

显式构造函数

如果您希望adder的构造函数为explicit,您还必须稍微更改返回语句。

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

答案 1 :(得分:0)

我头脑中唯一的解决方案就是将这个“添加”作为一个具有重载括号运算符的类对象,它将返回新对象,然后从中调用新的括号,但是你需要从中返回最终值不知怎的,就像一些getter func。

PackageManager m = getReactApplicationContext().getPackageManager();
        String s = getReactApplicationContext().getPackageName();
        try {
            PackageInfo p = m.getPackageInfo(s, 0);
            s = p.applicationInfo.dataDir;
            Log.i("Register", s);
        } catch (PackageManager.NameNotFoundException e) {
            Log.w("Register", "Error Package name not found ", e);
        }

但它似乎没有什么用处,可能有更好的方法来实现你想要的东西。