如何通过运算符将参数传递给函数<<?
How to pass arguments to a function through << operator?
是否可以重载<<
运算符以使其工作?
void f (int f)
{
}
int main ()
{
f << 2;
}
我需要学习什么才能工作?
如果您想拨打任何类似的电话
f << arg1 << ... << argN;
行为与相同
f(arg1, ..., argN);
那么下面的C++11代码可以执行您想要的操作。
对于每个想要这样调用的函数,创建一个"代理对象",其中包含要在函数f
上调用的参数。这个对象应该返回一个新的"代理对象",然后它需要少一个参数。很好的副作用:这可以用于变元。
以下是带有运行示例的完整代码:http://ideone.com/NFtnuT
简而言之,此代码执行以下操作:它定义了一个具有可变模板参数的模板类:
template<class R, /* ... */>
class ProxyFunction
{
// Underlying function:
std::function<R(/* ... */)> f;
public:
ProxyFunction(std::function<R(/* ... */)> f) : f(f) {}
ProxyFunction<R, /* one arg less */> operator <<(/* one argument */) {
/* create new proxy function with one argument less */
}
};
对于最后一个参数,您应该在销毁时或强制转换为返回类型R
时调用基础函数。这是通过对/*...*/
实际上是nothing的情况的模板类进行部分专门化来实现的。
该代码被称为:
// Create proxy function. You can pass f around as you want.
auto f = makeProxy(/* underlying "real" function */);
// Call f using this syntax, discarding the result:
f << a << b;
// Use its result:
int result = f << a << b;
现在,它的好处是它支持currying:
auto g = (f << a); // Bind first parameter, but don't call yet.
int result = (g << b); // Bind second parameter, now call it.
f
需要是具有重载operator <<
的类的实例,或者它必须返回具有重载运算符的类型的对象(但您需要将其称为f()
)。
struct F
{
F& operator << (int x) { return *this; }
};
//...
F f;
f << 2;
只有当操作数具有用户定义的类型(类类型或枚举)。你可以想象这样的定义:
?? operator<<( void (*f)( int ), MyType );
其中MyType
是枚举或类类型(但不是int
),但你想吗?在C++中,<<
已经建立了两个含义:格式化数据(用于最终输出)和左移(两者都表示左手操作数中的状态)。让操作员做一些不相关的事情是在操作超负荷滥用。当读者看到<<
时,他有权假设正在进行某种格式化或移位。为一些无关的事情重载<<
会使他感到困惑。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 为什么COUT在朋友函数中不起作用,该功能超载了操作员&lt;&lt;这是一个iStream运算符
- 重载运算符<<:此运算符函数的参数太多
- std::pair的默认构造函数<>将基本类型(int等)设置为零