如何定义从函数指针到字符串的映射

How to define a map from function pointers to strings

本文关键字:指针 字符串 映射 函数 何定义 定义      更新时间:2023-10-16

我正在尝试定义从成员函数指针到C++字符串的映射。 但是编译器抱怨没有为成员函数指针定义运算符<。 有没有办法做到这一点?

示例代码:

#include <map>
#include <string>
class foo;
typedef void (foo::*fooFunc)();
class foo {
public:
  foo() {
    myMap[func]="example function";
  }
  void func() {};
  std::map<fooFunc,std::string> myMap;
};

产生的错误消息:

    In file included from C:/msys64/mingw64/include/c++/6.2.0/bits/stl_tree.h:65:0,
                 from C:/msys64/mingw64/include/c++/6.2.0/map:60,
                 from grr.cpp:1:
C:/msys64/mingw64/include/c++/6.2.0/bits/stl_function.h: In instantiation of 'constexpr bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = void (foo::*)()]':
C:/msys64/mingw64/include/c++/6.2.0/bits/stl_map.h:501:32:   required from 'std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](std::map<_Key, _Tp, _Compare, _Alloc>::key_type&&) [with _Key = void (foo::*)(); _Tp = std::__cxx11::basic_string<char>; _Compare = std::less<void (foo::*)()>; _Alloc = std::allocator<std::pair<void (foo::* const)(), std::__cxx11::basic_string<char> > >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = std::__cxx11::basic_string<char>; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = void (foo::*)()]'
grr.cpp:9:15:   required from here
C:/msys64/mingw64/include/c++/6.2.0/bits/stl_function.h:386:20: error: invalid operands of types 'void (foo::* const)()' and 'void (foo::* const)()' to binary 'operator<'
       { return __x < __y; }
                ~~~~^~~~~

std::map需要比较运算符作为其键。默认情况下,它使用 operator < .由于未为指向成员类型的operator <定义,因此会收到此错误。要修复它,您需要定义一个自定义比较运算符并将其作为参数提供给std::map。或者,使用其他容器。

从 cpp 首选项:

std::map 是一个包含键值的排序关联容器 与唯一键配对。键使用比较进行排序 函数比较。搜索、删除和插入操作具有 对数复杂度。地图通常实现为红黑 树

如果你想要关于如何编写这样的比较运算符的选项,这里已经回答了。