- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我理解在其类之外传递成员函数地址的基本问题。我觉得 mem_fn() 可能是解决方案,但我在具体细节上遇到了麻烦。
我在类 p 中有一个成员函数,当前声明为
typedef void (*valNamedFlagsCallback)(const int, const bool);
bool valNamedFlags(const OptBlk *operand, const char *description_of_value_or_NULL, const int subscripts[], const char *names[], valNamedFlagsCallback callBack);
在 e 类中,我试图用
调用 valNamedFlagspInstance->valNamedFlags(operand, "Statement types", statementsSubscripts, statementsNames, std::mem_fn(&e::setStatement));
(我开始时没有使用 mem_fn(),但当然有经典的“指向成员函数的指针”问题。我已经尝试了 &e::setStatement 和普通的 &setStatement。)
FWIW,setStatement 的原型(prototype)为
void setStatement(const int ifcid, const bool isAffirmative);
如果我删除 mem_fn() 并将 setStatement 声明为静态,则一切正常。我只是指出这一点,以此表示我已经消除了所有其他可能的问题;我唯一的问题是“指向成员函数的指针”问题。不幸的是,setStatement() 需要是成员函数,而不是静态函数。
我在 MS VS 2010 中遇到的具体错误是
bool p::valNamedFlags(const OptBlk *,const char *,const int [],const char *[],p::valNamedFlagsCallback)' : cannot convert parameter 5 from 'std::tr1::_Mem_fn3<_Rx,_Pmf,_Arg0,_Arg1,_Arg2>' to 'p::valNamedFlagsCallback'
我想保持回调声明独立于类e;也就是说,我不想去
typedef void (*e::valNamedFlagsCallback)(const int, const bool);
因为我想让 p 比这更通用。
mem_fn() 是正确的解决方案还是我离题太远了?如果是这样,我应该如何在 valNamedFlags() 原型(prototype)中声明回调?
或者我应该采用不同的方法吗?
最佳答案
实际上,按照某些人的建议,您在执行类似绑定(bind)的操作时会遇到问题,因为您的回调被定义为一个简单的函数指针,而不是一个可调用对象。
如果你负担得起,你可以改变你的
typedef void (*valNamedFlagsCallback)(const int, const bool);
类似于
typedef std::function<void(int, bool)> valNamedFlagsCallback
(还要注意值参数上的 const
不会影响函数的签名),那么您可以使用 std::bind()
,
using namespace std::placeholders;
pInstance->valNamedFlags(operand,
"Statement types",
statementsSubscripts,
statementsNames,
std::bind(&E::setStatement, e, _1, _2));
或者您可以使用 lambda:
pInstance->valNamedFlags(operand,
"Statement types",
statementsSubscripts,
statementsNames,
[&](int i, bool b) { e->setStatement(i, b); });
如果您必须将它保留为一个简单的函数,那么您必须发送一个引用正确对象的函数作为全局/静态变量。
关于c++ - 如何在函数声明中声明 C++ mem_fn(member_function)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35321362/
这是一个后续问题 mem_fn to function of member object 这是当前代码。 #include #include #include struct Int {
KDE/PIM Zanshin 项目在其代码中的多个位置使用了 std::mem_fn,结果证明至少有 1 个版本的 Apple clang(随 OS X 10.9 提供的最新 Xcode 提供的版本
我很困惑为什么需要 std::mem_fn。 我有一个函数接受任何可调用对象(lambda、函数指针等),并将其绑定(bind)到一个参数。 例如: template void Class::DoBi
我正在修补 std::mem_fn,但无法设法将其绑定(bind)到结构成员的数据/函数(更深一层)。 我希望代码能比我描述的更好地说明问题,因为我不熟悉术语。 #include struct In
编译以下代码时,Visual Studio报告: \main.cpp(21): error C2664: 'std::_Call_wrapper,false> std::mem_fn(int Clas
我已经实现了一个C++程序,该程序创建了三个不同的Person对象。这些对象被共享并存储在 vector 中。 函数getVector()以const std::vector>&作为输入并返回std:
我有以下片段: struct Foo { Foo(int num):num_(num){} void print_add(int i) const { std::cout vpf{
我有一个更复杂的包装类版本,它封装了如下用户类型的 std::vector。 struct UserType1Encapsulator { template UserType1Encap
我可以用 C++ 实现以下功能吗?在调用回调方法之前,我想保持未指定 myInstance 变量,而不是将其包含在 boost::bind 实例中。 MyClass *myInstance; void
我有一个带有默认参数的成员函数的类。 struct Class { void member(int n = 0) {} }; 通过 std::tr1::mem_fn 我可以调用它: C
编译以下代码时,Visual Studio 报告: \main.cpp(21): error C2664: 'std::_Call_wrapper,false> std::mem_fn(int Cla
有人可以推荐 tr1 的 mem_fn 和绑定(bind)实用程序的一些很酷的实际用途吗?我不需要深奥的 c++ 来开发库。只是一些利用这些的应用程序级编码。 任何帮助将不胜感激。 最佳答案 我已将
考虑这个人为的例子: template void funny_transform(Iter first, Iter last, vector& v) { transform(first, la
考虑 the following code : struct A { int& getAttribute(); const int& getAttribute() const; };
这是由于 mem_fn() 的实现没有定义 __forceinline/inline/__attribute__((always_inline)) 造成的吗?是否可以解决这个问题,例如使用自己的 me
我正在使用 C++11 和 MSVC2013 尝试在我的类中使用函数指针来拥有自己的成员函数。 class MyClass { public: // ... QColor Co
auto 很好,但我需要在类中声明一个成员,而不是堆栈中的变量。 decltype 有效,但不知何故看起来很奇怪 class Automation { void _init_state(int
我想把这个结果: std::tr1::mem_fn(&ClassA::method); 在一个变量中,这个变量的类型是什么? 看起来像这样: MagicalType fun = std::tr1::m
我理解在其类之外传递成员函数地址的基本问题。我觉得 mem_fn() 可能是解决方案,但我在具体细节上遇到了麻烦。 我在类 p 中有一个成员函数,当前声明为 typedef void (*valNam
我有以下代码: #include struct X { int get() const& { return 42; } }; template std::result
我是一名优秀的程序员,十分优秀!