【问题标题】:boost::tuple with member function pointer带有成员函数指针的 boost::tuple
【发布时间】:2015-10-22 08:55:50
【问题描述】:

由于某种原因,我收到此错误消息

'void (S::* const)()' 和 'void (S::* const)()' 类型的无效操作数到二进制 'operator

对于这个代码sn-p:

#include <boost/tuple/tuple.hpp>
#include <boost/tuple/tuple_comparison.hpp>

struct S
{
    void f() {}
};

typedef void(S::*tdef)();

int main()
{
    boost::tuple<tdef> t1(&S::f);
    boost::tuple<tdef> t2(&S::f);
    return t1 < t2;
}

Boost 文档对在元组中使用成员函数指针(除了它们是有效元素)非常守口如瓶,所以我真的不知道可能是什么问题或那些“const”限定符是如何进入表达。

有什么提示吗?

【问题讨论】:

  • 你想用 operator&lt; 实现什么? c++ 中的成员函数指针没有关系可比性。
  • boost::tuples 按字典顺序进行比较。因此t1 &lt; t2 实际上是&amp;S::f &lt; &amp;S::f,编译器抱怨没有二进制operator&lt; 来比较这些类型。
  • 我认为将 &S::f 的参数类型推导出为 void (S::* const)() 是有道理的。函数的地址(在本例中为 S::f)是一个常数。您可以尝试为类型重载全局运算符
  • 目标是一个以 mfptr 作为 map 键的类,但我想我会跳过那个成员,因为我没有更好的主意,我不想使用 hacks。感谢所有的cmets!

标签: c++ boost tuples member-function-pointers c++98


【解决方案1】:

元组将尝试对函数指针进行比较,您只能比较函数指针是否相等。另请参考this question

函数指针在 C++ 中是不可比较的。支持相等比较,但至少有一个指针实际指向虚成员函数的情况除外(在这种情况下,结果未指定)。

【讨论】:

  • 如果您查看 tuple_comparison.hpp 的实现,您会看到运算符(在您的情况下为 lt)正在遍历元组内的所有类型并在它们上调用
猜你喜欢
  • 1970-01-01
  • 2011-10-27
  • 2011-06-01
  • 1970-01-01
  • 2016-08-11
  • 2010-12-27
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
相关资源
最近更新 更多