我有一个练习,我需要编写一个函数。功能方案看起来像
auto add(int a){
}
我需要能够用许多括号调用此函数:
add(1)(2)(3); // 6
add(1)(2)(3)(4); // 10
add(1)(2)(3)(4)(5); // 15
但我无法弄清楚在这种情况下我应该使用哪种C ++功能。我听说我应该使用仿函数,但我不知道在这种情况下这是不是最好的想法。
答案 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);
}
但它似乎没有什么用处,可能有更好的方法来实现你想要的东西。