1

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

void f (int f)
{
}

int main ()
{
    f << 2;
}

我需要学习什么才能使它起作用?

4

3 回答 3

3

如果您想拨打任何电话,例如

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/*...*/这是通过针对实际什么都没有的情况部分专门化模板类来完成的。

然后代码被称为:

// 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.
于 2013-02-12T09:34:45.023 回答
2

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

struct F
{
   F& operator << (int x) { return *this; }
};

//...
F f;
f << 2;
于 2013-02-12T08:56:40.003 回答
2

仅当至少一个操作数具有用户定义的类型(类类型或枚举)时,重载运算符才是合法的。您可以想象定义如下内容:

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

MyTypeenum 或类类型(但不是 )在哪里int,但你想要吗?在 C++ 中,<<有两个既定含义:格式化数据(用于最终输出)和左移(两者都暗示左侧操作数中的状态)。重载操作员做一些不相关的事情是操作重载滥用。当读者看到 a<<时,他有权假设某种格式或转换正在发生。为不相关的事情超载<<会让他感到困惑。

于 2013-02-12T09:32:41.203 回答