1

使用友元运算符习语:

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+for的函数指针Foo

Bar可以说以下几点:

auto fn = static_cast<Bar (*)(Bar, Bar)>(&operator+);
fn({},{});

但是,如果我对Foo版本执行相同操作,g++ 和 clang++ 会通知我:

// g++ 4.8.3
error: ‘operator+’ not defined
   auto f = static_cast<Foo (*)(Foo, Foo)>(&operator+);
                                                    ^

// clang++ 3.2-11
error: use of undeclared 'operator+'
  auto f = static_cast<Foo (*)(Foo, Foo)>(&operator+);
                                           ^

这本质上是不可能的,还是有办法引用该函数?

4

1 回答 1

3

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

如果要获取地址,则还需要在周围的命名空间中声明它。

或者,您可以使用 lambda 而不是老式函数指针:

auto f = [](Foo f1, Foo f2){return f1+f2;}
于 2014-06-12T16:22:52.867 回答