函数调用中的多个圆括号
More than one round bracket in function call?
我有一个练习,我需要写一个函数。函数方案看起来像
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);
}
};
但这似乎没有用,可能有更好的方法来完成你想要得到的东西。
相关文章:
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 变量没有改变?通过向量的函数调用
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 模板函数调用
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 析构函数调用
- 成员函数调用和C++对象模型
- 使用共享指针的函数调用,其对象应为 const
- C++:编译时检查匹配的函数调用对?
- 函数调用C++中的参数太少
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 返回指向对象的指针的函数调用是否为 prvalue?
- C++ 如何重载 [] 运算符并进行函数调用
- 函数调用中的多个圆括号
- 函数调用周围的圆括号
- 重载圆括号()是否影响构造函数调用
- 在xlc c++编译器中,给构造函数调用添加圆括号会导致参数重复错误