См. следующий пример:
Код: Выделить всё
template
concept ValidNonConstSignature = requires(FunctionT exec_fn, T& value) { exec_fn(value); };
template
concept ValidConstSignature = requires(FunctionT exec_fn, const T& value) { exec_fn(value); };
class Foo {
public:
template requires ValidNonConstSignature
auto
getBar(FunctionT callback) {
return callback(m_abc);
}
template requires ValidConstSignature
auto
getBar(FunctionT callback) const {
return callback(m_abc);
}
private:
int m_abc {};
};
int main()
{
Foo foo;
foo.getBar([](int& abc){ return abc++; });
foo.getBar([](const int& abc){ return abc++; }); // correct compiler error: increment of read-only reference ‘abc’
foo.getBar([](auto& abc){ return abc++; }); // incorrect compiler error: increment of read-only reference ‘abc’
foo.getBar([](const auto& abc){ return abc++; }); // correct compiler error: increment of read-only reference ‘abc’
return 0;
}
Если метод getBar(FunctionT callback) const удален, foo.getBar([](auto& abc){ return abc++; }); компилируется нормально.
Есть ли способ как-то улучшить концепцию правильного выбора неконстантного метода? Моя первоначальная идея заключалась в том, чтобы получить типы аргументов через другой шаблон из переданного обратного вызова, но компилятор жаловался на неполный тип при передаче lamda с auto в нем.
Подробнее здесь: https://stackoverflow.com/questions/791 ... -arguments