gpt4 book ai didi

c++ - 如何构建std::map到派生类重载的函数

转载 作者:行者123 更新时间:2023-12-02 09:47:41 31 4
gpt4 key购买 nike

我想建立一个std::map到一组带有Base对象的函数,同时还要为特定的Derived类重载。如果函数未过载,则设置如下:

#include <functional> 

bool func_1( const Base& );
bool func_2( const Base& );

std::map< std::string, std::function< bool (const Base&) > > funcMap = {
{ "a", func_1 },
{ "b", func_2 }
};
这没有问题。但是现在,如果我有一个继承自Base的类Derived:
class Derived : public Base {
...
}
并添加“func_1”的重载版本:
bool func_1( const Base& );
bool func_2( const Base& );
bool func_1( const Derived& );
std::map< std::string, std::function< bool (const Base&) > > funcMap = {
{ "a", func_1 },
{ "b", func_2 }
};
它将不再编译,并显示错误消息:
error: could not convert ‘{{"a", func_1},{"b", func_2}}’ from ‘<brace-enclosed initializer list>’ to ‘std::map<std::__cxx11::basic_string<char>, std::function<bool(const Base&)> >’
天真的我会假设,因为映射是使用std::function 的模板参数定义的,因此它可以正确地将func_1对象与采用Base参数的对象匹配,但是显然不是这样案子。有没有办法解决或避免这个问题?

最佳答案

您将必须将函数指针转换为所需的类型,并且编译器将为要转换为的类型选择正确的重载:

{"a", (bool(*)(const Base&))func_1 },
这不是很干净,并且函数指针语法可能会令人困惑,但这是使代码正常工作所需要的
我没有意识到即使没有与签名真正匹配的函数,C-cast也会编译,因此这种解决方案更安全:
{"a", static_cast<bool(*)(const Base&)>(func_1)}
另外,当我们使用它时,您还可以使用lambda:
{"a", [](const Base & o) { return func_1(o); } }

关于c++ - 如何构建std::map到派生类重载的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64123933/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com