如何通过<<将参数传递给函数运营商?

时间:2013-02-12 08:56:05

标签: c++ operator-overloading

是否可以重载<<运算符以使其有效?

void f (int f)
{
}

int main ()
{
    f << 2;
}

我需要学习什么来工作?

3 个答案:

答案 0 :(得分:3)

如果您想进行任何调用,请

f << arg1 << ... << argN;

表现与

相同
f(arg1, ..., argN);

然后下面的 C ++ 11 代码可以满足您的需求。

对于您想要调用的每个函数,创建一个“代理对象”,其中包含要在函数f上调用的参数。该对象应该返回一个新的“代理对象”,然后需要一个参数。好的副作用:这可以用于参数currying。

以下是包含正在运行的示例的完整代码: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时调用基础函数。这是通过对/*...*/实际上没有的情况部分专门化模板类来完成的。

然后将代码称为:

// 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.

答案 1 :(得分:2)

f需要是一个具有重载operator <<的类的实例,或者它必须返回一个带有重载运算符的类型的对象(但是你需要调用它{{1} })。

f()

答案 2 :(得分:2)

重载运营商只有至少有一个运营商才合法 operands具有用户定义的类型(类类型或枚举)。您 可以想象定义如下:

?? operator<<( void (*f)( int ), MyType );

其中MyType是枚举或类类型(但不是 int),但你想要吗?在C ++中,<<已经建立了两个 含义:格式化数据(用于最终输出)和左移 (两者都暗示在左手操作数中的状态)。 操作员重载以执行不相关的操作 超载滥用。当读者看到<<时,他有权利 假设正在进行某种格式化或转换。 为不相关的内容重载<<会让他感到困惑。