匹配重载C ++的隐式转换

时间:2016-07-21 10:01:52

标签: c++ c++11

我在理解函数重载是如何工作时遇到了问题,归结为这个简单的例子:

class Foo {
public:
  void bar(const bool & val) {} 
};

void DoFn(std::function<void( Foo*, const wxString&)> fn ) {}

如果我现在这样打电话给DoFn:

DoFn( &Foo::bar );

它编译得很好。如何在std :: function的模板参数中从bool转换为wxString?如果我将wxString更改为std :: string,则无法按预期编译。

(wxString是wxWidgets中的一个类,版本2.8)

我真正不明白的是wxString类如何声明它可以从bool转换为。

我尝试过如下课程:

class FakeString {
 public:
  FakeString(bool) {};
  FakeString(const bool &){};
};

并用FakeString替换DoFn中的wxString,但它没有编译说:

could not convert '&Foo::bar' from 'void (Foo::*)(const bool&)' to 'std::function<void(Foo*, const FakeString&)>'

2 个答案:

答案 0 :(得分:6)

您的转换订单错误:它是关于将wxStrging转换为bool,而不是转换为其他方向。

class FakeString {
 public:
  operator bool() const { return false;  }
};

wxString没有bool转换运算符,但类似的东西:隐式转换为const char*

class FakeString {
 public:
  operator const char*() const { return nullptr;  }
};
  

如果构建wxWidgets并将wxUSE_STL设置为1,则隐式   禁用转换为窄C字符串和宽C字符串   替换为隐式转换为std :: string和std :: wstring。

these是您正在寻找的wxString方法,指针转换运算符。

答案 1 :(得分:0)

我认为std::function的语法可能存在一些混淆。你有什么理由不这样做吗

struct Foo {
  void bar(const bool & val) {} 
};

void DoFn(std::function<void(const bool&)> fn ) {}

然后

Foo foo = Foo();
DoFn(&foo::bar);

您声明的是一个带有Foo*WxString参数的函数。我不认为这是你想要的。与Python之类的语言不同,在c ++中,您无法显式传递this指针。返回void的非静态成员函数指针的语法为void(Foo::*)(const bool&)。我的猜测是编译器没有抱怨,因为具有正确签名的函数是偶然的。