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

Posted

技术标签:

【中文标题】如何定义从函数指针到字符串的映射【英文标题】:How to define a map from function pointers to strings 【发布时间】:2018-04-14 16:51:34 【问题描述】:

我正在尝试在 C++ 中定义从成员函数指针到字符串的映射。但是编译器抱怨没有为成员函数指针定义 operator

示例代码:

#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; 
                ~~~~^~~~~

【问题讨论】:

【参考方案1】:

std::map 的键需要比较运算符。默认情况下,它使用operator &lt;。由于没有为 pointer-to-member 类型定义 operator &lt;,因此您会收到此错误。 要修复它,您需要定义一个自定义比较运算符并将其作为参数提供给std::map。或者,使用其他容器。

来自cppreference:

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

如果您想了解如何编写这样一个比较运算符,已经回答了here。

【讨论】:

我知道我需要一个比较运算符,但我不知道如何为成员函数指针编写一个。我原以为有某种方法可以将其转换为整数类型,但这似乎不是真的。 @q.t.f.我更新了答案,如何做到这一点已经在另一个问题上得到了回答。但是,这并不简单,您可能需要考虑不同的设计。 呃。基本上答案是“不”,没有有效的便携方式。

以上是关于如何定义从函数指针到字符串的映射的主要内容,如果未能解决你的问题,请参考以下文章

字符串和成员函数指针的 C++ 映射

JNA 结构和指针映射

使用功能指针的STL映射

指针函数和函数指针

如何从 char* 函数返回指针

映射到具有不同数量参数和不同数据类型的函数指针