0

这是我的问题:

我有一个函数指针向量和一个迭代器:

std::vector<void* (*) (void*)> f_callbackVector;
std::vector<void* (*) (void*)>::iterator f_callbackVectorIterator = f_callbackVector.begin();

我用一些函数填充向量:

f_callbackVector.push_back((void* (*) (void*))handleDeliveryModeChange);

当我在函数中时,我希望能够检查迭代器是否拥有指向当前函数的指针。我试过这个:

void handleDeliveryModeChange(SESSION s, const DELIVERY_MODE d1, const DELIVERY_MODE d2) {
    if (static_cast<void (*) (void*, DELIVERY_MODE, DELIVERY_MODE)>((*f_callbackVectorIterator)) == &handleDeliveryModeChange) {
    LOG_MESSAGE("\n\n\n\nWOW\n\n\n\n");
}
}

并得到:

invalid static_cast from type âvoid* (*)(void*)â to type âvoid (*)(void*, DELIVERY_MODE, DELIVERY_MODE)â

我将不胜感激。

谢谢!

UPD: 我试过了:

if (*(f_callbackVectorIterator) == &handleDeliveryModeChange) 

并得到错误:comparison between distinct pointer types âvoid ()(void)â and âvoid ()(void, DELIVERY_MODE, DELIVERY_MODE)â lacks a cast

我什至试过这个怪物:

if ((*f_callbackVectorIterator) == static_cast<&(void* (*) (void*))>(&handleDeliveryModeChange))

仍然没有运气,有很多晦涩的语法错误。

4

2 回答 2

4

&myfunc获取函数的地址。

于 2013-03-22T15:01:38.750 回答
1

你在对编译器撒谎:

f_callbackVector.push_back((void* (*) (void*))handleDeliveryModeChange);

handleDeliveryModeChange与此签名不匹配。它的签名实际上是:

void (*)(SESSION, DELIVERY_MODE, DELIVERY_MODE)

你可以通过改变这个来使它工作:代码

#include <vector>
#include <iostream>

typedef void* SESSION;       // Or whatever it is
typedef void* DELIVERY_MODE; // You didn't say what these are
typedef void* (*Func) (SESSION, DELIVERY_MODE, DELIVERY_MODE);
typedef std::vector<Func> FuncVector;

FuncVector f_callbackVector;
FuncVector::iterator f_callbackVectorIterator = f_callbackVector.begin();

// Note: Your pointers return void*, so I changed the return type from void:
void* handleDeliveryModeChange
(
  SESSION s,
  const DELIVERY_MODE d1,
  const DELIVERY_MODE d2
)
{
  if ((*f_callbackVectorIterator) == &handleDeliveryModeChange)
  {
    std::cout << "\n\n\n\nWOW\n\n\n\n";
  }
  return NULL;
}

int main()
{

  f_callbackVector.push_back(handleDeliveryModeChange);
}
于 2013-03-22T15:28:41.723 回答