0

我怎样才能拥有通用函数指针。考虑下课。

#ifndef PERSON_HPP_
#define PERSON_HPP_

#include <string>

class Person {
public:
  Person() {
  }
  void SetName(std::string person_name) {
    m_name = person_name;
  }
  void setDept(std::string dept_name) {
    m_dept = dept_name;
  }
  void setAge(int person_age ) {
    m_age = person_age;
  }
  std::string getName() {
    return m_name;
  }
  std::string getDept() {
    return m_dept;
  }
  int getAge() {
    return m_age;
  }
private:
  std::string m_name;
  std::string m_dept;
  int m_age;
};

#endif

我想将函数指针存储在std::vectorfor setName, setDept,constructor等等...

对于正常功能,我可以使用以下方法实现此目的

#include <vector>


int mult(int a) { 
  return 2*a; 
}

int main()
{
    int b;

    std::vector<void *(*)(void *)> v;
    v.push_back((void *(*)(void *))mult);
    b = ((int (*)(int)) v[0])(2);        // The value of b is 2.

    return 0;
}

Boost在我的情况下不允许。

4

3 回答 3

1

你可以写:

// Pointer to member function as a data type. 
typedef void (Person::*MethodPtr)(std::string); 
std::vector<MethodPtr> v;

指向成员的指针与任何其他数据类型没有任何不同。只有它应该用作二元运算符:

Person *bad_guy = ...;
bad_guy->*v[4]("abcd");
于 2012-10-31T08:25:39.973 回答
1

似乎您想避免重写该getter/setter方法,该方法通常内部有类似的代码。
但是,将函数指针用于此类任务是一个坏主意,因为它会降低可读性,增加复杂性并且不允许编译器进行与内联相关的优化。

如果您想自动生成代码以供使用,请getter/setter使用具有生成 getter/setter 功能的编辑器,例如 eclipse,或者在这种情况下您可以求助于宏:

#define SETTER(TYPE,FIELD) \
  set##FIELD (const TYPE FIELD) \
  { \
    this->m_##FIELD = FIELD; \
  }
#define GETTER(FIELD) \
  get##FIELD () const \
  { \
    return this->m_##FIELD; \
  }

并将其用作,

class Person {
public:
  Person() {
  }
  void SETTER(std::string, name);
  void SETTER(std::string, dept);
  void SETTER(int, age);

  int GETTER(name);
  int GETTER(dept);
  int GETTER(age);

private:
  std::string m_name;
  std::string m_dept;
  int m_age;
};

#undef SETTER
#undef GETTER
于 2012-10-31T08:27:14.597 回答
0

如果您确实需要将成员指针转换为通用类型(如 void*),您可以执行以下操作:

template <typename T>
void* castToVoidStar(T x) {
  return *reinterpret_cast<void**>(&x);
}

void *afterCast = castToVoidStar(&Person::getName)

但是,我认为这样做并不明智。C++ 有类型安全是有原因的。

于 2012-10-31T08:37:06.403 回答