Одной из опций будет шаблонный тип указателя на элемент .Они обычно используются с типами class
или struct
, но также действительны с типом union
.Тип указателя на член объявляется как MemberType ClassType::*pointer_name
, а имя такого указателя можно использовать справа от оператора .*
или ->*
.
template <typename T>
void showArr(const ThreeTypes arr[], int size, T ThreeTypes::*ptr)
{
for (int i = 0; i < size; ++i)
std::cout << (arr[i].*ptr) << std::endl;
}
И вы создаетезначение указателя на член с синтаксисом &ClassType::member_name
:
int main()
{
const int SIZE = 50;
ThreeTypes arr[SIZE];
for (int i = 0; i < SIZE; i++)
arr[i].real = 2.37;
showArr(arr, SIZE, &ThreeTypes::real);
}
Еще один более общий вариант - взять вызываемый функтор:
template <typename F>
void showArr(const ThreeTypes arr[], int size, const F& func)
{
for (int i = 0; i < size; ++i)
std::cout << func(arr[i]) << std::endl;
}
Вы можете создатьфунктор для доступа к члену с помощью лямбды или std::mem_fn
:
void print_reals_twice(const ThreeTypes arr[], int size)
{
showArr(arr, size, [](const ThreeTypes& u) { return u.real; });
// Same effects:
showArr(arr, size, std::mem_fn(&ThreeTypes::real));
}
Но определение showArr
таким образом также позволяет вам передать функтор, который делает что-то более сложное, чем просто возвратчлен, если хотите:
void print_sin2x_all(const ThreeTypes arr[], int size)
{
showArr(arr, size, [](const ThreeTypes& u) { return std::sin(2*u.real); });
}