我无法理解函数重载的工作原理,归结为这个简单的例子:
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):
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&)>'
你弄错了转换顺序:它是关于将 wxStrging
转换为 bool
,而不是相反。
class FakeString {
public:
operator bool() const { return false; }
};
wxString 没有 bool 转换运算符,但有类似的东西:到 const char*
的隐式转换:
class FakeString {
public:
operator const char*() const { return nullptr; }
};
If you built wxWidgets with wxUSE_STL set to 1, the implicit conversions to both narrow and wide C strings are disabled and replaced with implicit conversions to std::string and std::wstring.
和these是您正在寻找的 wxString 方法,指针转换运算符。
我是一名优秀的程序员,十分优秀!