メンバー関数へのポインターのように、メンバーへのポインターを定義できます。
typedef int team::*member_t;
すべてのメンバーへのポインタの配列を持つことができます:
static member_t member[size];
このアプローチでは、メンバー関数を定義してすべてのメンバーを反復処理するのは簡単です。
template <class F>
void for_each(F f)
{
for (int i = 0; i < size; ++i)
f(this->*member[i]);
}
また、プリプロセッサ マクロを使用すると、すべてのメンバーを 1 か所で定義し、メンバーへのポインターを別の定義で定義できるため、順序を変更しても間違いはありません。完全なコードを参照してください:
struct team {
#define TEAM_MEMBERS(prefix,suffix) \
prefix player1 suffix, \
prefix player2 suffix, \
prefix player3 suffix
int TEAM_MEMBERS(,);
static const int size = 3;
typedef int team::*member_t;
static member_t member[size];
template <class F>
void for_each(F f)
{
for (int i = 0; i < size; ++i)
f(this->*member[i]);
}
};
team::member_t team::member[team::size] = {
TEAM_MEMBERS(&team::,)
};
そしていくつかのテスト:
#include <iostream>
int main() {
team t = { 0 };
t.for_each([](int m) { std::cout << m << "\n"; }); // prints 0,0,0
int n = 0;
t.for_each([&n](int& m) { m = n++; });
t.for_each([](int m) { std::cout << m << "\n"; }); // prints 0,1,2
t.player2 = 7;
t.for_each([](int m) { std::cout << m << "\n"; }); // prints 0,7,2
}