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

Jon*_*an. 0 c++ c++11

我有一个问题,理解函数重载是如何工作的,它归结为这个简单的例子:

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

void DoFn(std::function<void( Foo*, const wxString&)> fn ) {}
Run Code Online (Sandbox Code Playgroud)

如果我现在这样称呼DoFn:

DoFn( &Foo::bar );
Run Code Online (Sandbox Code Playgroud)

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

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

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

我尝试过如下课程:

class FakeString {
 public:
  FakeString(bool) {};
  FakeString(const bool &){};
};
Run Code Online (Sandbox Code Playgroud)

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

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

Dut*_*tow 6

您的转换顺序错误:它是关于转换,而不是转换wxStrgingbool另一个方向.

class FakeString {
 public:
  operator bool() const { return false;  }
};
Run Code Online (Sandbox Code Playgroud)

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

class FakeString {
 public:
  operator const char*() const { return nullptr;  }
};
Run Code Online (Sandbox Code Playgroud)

如果在wxUSE_STL设置为1的情况下构建wxWidgets,则禁用对窄C字符串和宽C字符串的隐式转换,并将其替换为对std :: string和std :: wstring的隐式转换.

这些是你正在寻找,指针转换运营商wxString方法.