我在理解函数重载是如何工作时遇到了问题,归结为这个简单的例子:
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&)>'
答案 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&)
。我的猜测是编译器没有抱怨,因为具有正确签名的函数是偶然的。