Една характеристика, която играе важна роля в много от писанията за дизайн, ориентиран към данни, е, че има много случаи, когато вместо AoS (масив от структури):
struct C_AoS {
int foo;
double bar;
};
std::vector<C_AoS> cs;
...
std::cout << cs[42].foo << std::endl;
по-ефективно е да подредите данните си в SoA (структура от масиви):
struct C_SoA {
std::vector<int> foo;
std::vector<double> bar;
};
C_SoA cs;
...
std::cout << cs.foo[42] << std::endl;
Сега това, което търся, е решение, което би ми позволило да превключвам между AoS и SoA, без да променям интерфейса за повикване, т.е., което бих могъл с минимални усилия и без допълнителни разходи за време на изпълнение (поне до точката на прекомерна индиректност), обадете се напр. cs[42].foo;
независимо от подреждането на данните, които използвам.
Трябва да отбележа, че примерният синтаксис по-горе е идеалният случай, който може и да е невъзможен, но бих се интересувал много и от близки приближения. Има ли желаещи?