你能引用一个结构中定义的友元运算符吗?

时间:2014-06-12 16:04:39

标签: c++ operator-overloading function-pointers friend-function

使用friend operator idiom:

struct Foo {
  friend Foo operator+(Foo, Foo) { return {}; }
};

// which is synonymous to the slightly less pretty:
struct Bar {
  friend Bar operator+(Bar, Bar); // optional
};
inline Bar operator+(Bar, Bar) { return {}; }

我基本上想要operator+的{​​{1}}的函数指针。

Foo我可以说以下内容:

Bar

但是,如果我对auto fn = static_cast<Bar (*)(Bar, Bar)>(&operator+); fn({},{}); 版本执行相同操作,g ++和clang ++会通知我:

Foo

这本质上是不可能的,还是有办法参考这个功能?

1 个答案:

答案 0 :(得分:2)

如果友元函数仅在类定义中声明,则通过限定或非限定查找无法找到它,只能通过参数依赖查找。这意味着您可以调用该函数,但不能获取其地址。

如果你想获取地址,那么你也需要在周围的命名空间中声明它。

或者,您可以使用lambda而不是old-school函数指针:

auto f = [](Foo f1, Foo f2){return f1+f2;}