Это просто, если вы знаете указатель на синтаксис члена и т.п. К сожалению, так редко используется, это своего рода эзотерическая особенность языка:
template <class T> void foo(T);
template <auto Field, class It>
auto myFunc(It begin, It end)
{
for (; begin != end; ++begin)
{
foo((*begin).*Field);
}
}
int main()
{
std::vector<Example> v{{5, true}, {8, false}};
myFunc<&Example::a>(v.begin(), v.end()); // will call foo<int>(5) , foo<int>(8)
myFunc<&Example::b>(v.begin(), v.end()); // will call foo<bool>(true) , foo<bool>(false)
}
Для template <auto Field
вам нужен C ++ 17.
Для C ++ 11 синтаксис более многословен:
template <class T, class F, F T::* Field, class It>
void myFunc(It begin, It end)
{ /* same */ }
int main()
{
std::vector<Example> v{{5, true}, {8, false}};
myFunc<Example, int, &Example::a>(v.begin(), v.end()); // will call foo<int>(5) , foo<int>(8)
myFunc<Example, bool, &Example::b>(v.begin(), v.end()); // will call foo<bool>(true) , foo<bool>(false)
}
Немного ОТ на ваш вопрос, но я не понимаю, почему вы усложняете себя с этой инициализацией std::list
. В C ++ ваш первый контейнер выбора должен быть std::vector
.
Также нет std::iterator