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::vector関数ポインタをfor setNamesetDeptなど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、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 に答える