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

C++ 匹配重载C+的隐式转换+;,c++,c++11,C++,C++11,我在理解函数重载如何工作时遇到了一个问题,可以归结为以下简单示例: class Foo { public: void bar(const bool & val) {} }; void DoFn(std::function<void( Foo*, const wxString&)> fn ) {} 它编译得很好。如何在std::function的模板参数中从bool转换为wxString?如果我将wxString更改为std::string,那么它将无法按预期

我在理解函数重载如何工作时遇到了一个问题,可以归结为以下简单示例:

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

void DoFn(std::function<void( Foo*, const wxString&)> fn ) {}
它编译得很好。如何在std::function的模板参数中从bool转换为wxString?如果我将wxString更改为std::string,那么它将无法按预期编译

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

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

我试着做了一个如下的课程:

class FakeString {
 public:
  FakeString(bool) {};
  FakeString(const bool &){};
};
并将DoFn中的wxString替换为FakeString,但它不会编译为:

could not convert '&Foo::bar' from 'void (Foo::*)(const bool&)' to 'std::function<void(Foo*, const FakeString&)>'
无法将“&Foo::bar”从“void(Foo::*)(const bool&)”转换为“std::function”

您的转换顺序搞错了:它是关于将
wxStrging
转换为
bool
,而不是转换到另一个方向

class FakeString {
 public:
  operator bool() const { return false;  }
};
wxString没有布尔转换运算符,但有类似的内容:隐式转换为
const char*

class FakeString {
 public:
  operator const char*() const { return nullptr;  }
};
如果在wxUSE_STL设置为1的情况下构建wxWidgets,则隐式 将禁用对窄C字符串和宽C字符串的转换,并且 替换为到std::string和std::wstring的隐式转换


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

您的转换顺序错误:它是关于将
wxStrging
转换为
bool
,而不是相反方向

class FakeString {
 public:
  operator bool() const { return false;  }
};
wxString没有布尔转换运算符,但有类似的内容:隐式转换为
const char*

class FakeString {
 public:
  operator const char*() const { return nullptr;  }
};
如果在wxUSE_STL设置为1的情况下构建wxWidgets,则隐式 将禁用对窄C字符串和宽C字符串的转换,并且 替换为到std::string和std::wstring的隐式转换


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

我认为可能会对
std::function
的语法产生一些混淆。你有什么理由不这么做吗

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

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

您声明的是一个采用
Foo*
WxString
参数的函数。我认为这不是你想要的。不像Python语言,在C++中,你不能显式地传递<代码>这个指针。返回
void
的非静态成员函数指针的语法应该是
void(Foo::*)(constbool&)
。我猜编译器不会抱怨,因为一个具有正确签名的函数碰巧在作用域中。

我认为可能会对
std::function
的语法产生一些混淆。你有什么理由不这么做吗

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

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


您声明的是一个采用
Foo*
WxString
参数的函数。我认为这不是你想要的。不像Python语言,在C++中,你不能显式地传递<代码>这个指针。返回
void
的非静态成员函数指针的语法应该是
void(Foo::*)(constbool&)
。我猜编译器不会抱怨,因为一个具有正确签名的函数偶然出现在范围内。

您能提供实际的工作代码吗?你绝对确定没有其他版本的
bar
包含你错过的
wxString
?我编译了这个代码,它不可能是这个代码,因为它缺少
#include
。你是说这是唯一的区别吗?是的,这对于实际问题来说似乎是不必要的。虽然我直接在stackoverflow中输入了伪字符串,因为我在剪贴板上丢失了它。你能提供你的实际工作代码吗?你绝对确定没有其他版本的
bar
包含你错过的
wxString
?我编译了这个代码,它不可能是这个代码,因为它缺少
#include
。你是说这是唯一的区别吗?是的,这对于实际问题来说似乎是不必要的。虽然我直接在stackoverflow中键入了伪字符串位,因为我在剪贴板上丢失了它。
DoFn
是用
&Foo::bar
调用的,它是
void(Foo::*)(const bool&)
,需要强制转换为
std::function
,因此
常量bool&
需要强制转换为
常量wxString&
。我错了吗?@Anton
std::function
执行类型擦除,并且基于有效用法,而不是签名。因此,只要函数可以用
Foo*
constwxstring&
调用,就可以了;链接到的是
操作符。也许我只是错过了什么?好吧,我想这是有道理的。std::function是如何获得这种类型的行为的?你是对的,它不是bool转换运算符,而是const char*。
DoFn
是用
&Foo::bar
调用的,它是
void(Foo::*)(const bool&)
,需要强制转换到
std::function
,因此,
constbool&
需要强制转换为
constwxstring&
。我错了吗?@Anton
std::function
执行类型擦除,并且基于有效用法,而不是签名。因此,只要函数可以用
Foo*
constwxstring&
调用,就可以了;链接到的是
操作符。也许我只是错过了什么?好吧,我想这是有道理的。std::function是如何获得这种类型的行为的?没错,它不是bool转换运算符,而是const char*。您可以显式地传递它。在我问题中的DoFn中,您可以调用fn(Foo(),wxString()),这将是正确的,
fn(Foo(),wxString())
是一个接受
Foo
wxString
的函数。这不是
指针<代码>此
内部
Foo::bar
*Foo
类型。我觉得你把事情搞糊涂了。对不起,我的观点是,我很快就把那条评论贴出来了