以下の内容はhttps://pyopyopyo.hatenablog.com/entry/2025/04/30/190000より取得しました。


メンバーへのポインタ(c++, .* と ->*演算子 )

c++のメンバへのポインタの使い方をまとめます

利用例

たとえば以下のデータ構造について

struct Employee {
    int id;
    std::string name;
    double salary;
};
std::vector<Employee> employees;

std::sort()で Employee::id をキーにソートしたい場合を考えます

この場合,メンバーポインタを使うと

sort_by_member(employees, &Employee::id);

と実装できるようになります

ソースコード

#include <vector>
#include <algorithm>
#include <string>

struct Employee {
    int id;
    std::string name;
    double salary;
};

template <typename T, typename U>
void sort_by_member(std::vector<T>& vec, U T::* member) {
    std::sort(vec.begin(), vec.end(), [=](const T& a, const T& b) {
            return a.*member < b.*member;
    });
}

int main() {
    std::vector<Employee> employees = {
        {102, "Alice", 70000.0},
        {101, "Bob", 50000.0},
        {103, "Charlie", 60000.0}
    };

    sort_by_member(employees, &Employee::id);
}

解説

テンプレートで

 U T::* member

と書き

&Employee::id

で実体化すると,

  • 型:T = Employee
  • 型:U = int
  • 変数: member = Employee型における int idのポインタ

となります

つまり

int  Employee::* member

です


Employee::id を参照するときは

  return a.*member < b.*member;

のように .* 演算子を使います

Employee 型のポインタに対しては

ptr->*member 

と ->* 演算子を使います




以上の内容はhttps://pyopyopyo.hatenablog.com/entry/2025/04/30/190000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14