可以定義指針成員一樣,成員函數指針:
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]);
}
並且使用預處理器宏 - 您可以在一個位置定義所有成員,在成員指針的其他定義中 - 所以您不會在更改順序時發生任何錯誤。查看全部代碼:
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
}
爲什麼你不使用數組/矢量,而不是結構的原因嗎? –
你可以在一定程度上作弊。在這種情況下,使用完全由相同大小的項組成的結構,可以獲取指向結構實例的指針並將其視爲數組。如果結構更加異構,那將無法工作。如果它是同質的,就像這樣,爲什麼不使用矢量或數組? – Rook
嗯,我有很多變量,這些變量彼此沒有關係,會被硬編碼到一個結構體中。我只是想通過遍歷它們來設置另一組數據到存在於我的結構中的變量 – sean