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&
。我错了吗?@Antonstd::function
执行类型擦除,并且基于有效用法,而不是签名。因此,只要函数可以用Foo*
和constwxstring&
调用,就可以了;链接到的是操作符代码>。也许我只是错过了什么?好吧,我想这是有道理的。std::function是如何获得这种类型的行为的?你是对的,它不是bool转换运算符,而是const char*。DoFn
是用&Foo::bar
调用的,它是void(Foo::*)(const bool&)
,需要强制转换到std::function
,因此,constbool&
需要强制转换为constwxstring&
。我错了吗?@Antonstd::function
执行类型擦除,并且基于有效用法,而不是签名。因此,只要函数可以用Foo*
和constwxstring&
调用,就可以了;链接到的是操作符代码>。也许我只是错过了什么?好吧,我想这是有道理的。std::function是如何获得这种类型的行为的?没错,它不是bool转换运算符,而是const char*。您可以显式地传递它。在我问题中的DoFn中,您可以调用fn(Foo(),wxString()),这将是正确的,fn(Foo(),wxString())
是一个接受Foo
和wxString
的函数。这不是此
指针<代码>此内部Foo::bar
为*Foo
类型。我觉得你把事情搞糊涂了。对不起,我的观点是,我很快就把那条评论贴出来了