У меня в кастомном списке есть такой метод:
template <typename T>
class MyList {
T *buf = nullptr;
...
void sort(const function<bool(const T& v1, const T& v2)> &compare) {
if (p_count > 1) std::sort(buf, buf+p_count, compare);
}
listData.sort([&](auto &it1, auto &it2) -> bool {
return tmplLess(
it1.field1, it2.field1,
it1.field2, it2.field2,
it1.field3, it2.field3);
});
Т.е. все просто, вот только в использовании нужно дублировать поля. Можно попробовать использовать tuple следующим образом:
template <typename ...Args>
void sort(const function<std::tuple<Args...>(const T& v)> &fields) {
sort([&](const T &v1, const T &v2) -> bool {
return fields(v1) < fields(v2); });
}
Но тогда уже не задействуются auto при написании использования, и следующий вызов генерит ошибку компиляции:
listData.sort([&](auto &it) {
return std::tuple(it.field1, it.field2, it.field3); });
template argument deduction/substitution failed:
note: ‘myFunc::<lambda(auto:45&)>’ is not derived from...
Как бы так сделать, что бы можно было сделать чуть лучше чем есть?