Выберите неконстантный метод на основе подписи Ламба с автоматическими аргументами.C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Выберите неконстантный метод на основе подписи Ламба с автоматическими аргументами.

Сообщение Anonymous »

У меня возникла следующая проблема: из-за автоматических аргументов лямбды выбран неправильный метод.
См. следующий пример:

Код: Выделить всё

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(обратный вызов функции) const, foo.getBar([](auto& abc){ return abc++; }); завершается с ошибкой для компиляции.
Если метод getBar(FunctionT callback) const удален, foo.getBar([](auto& abc){ return abc++; }); компилируется нормально.
Есть ли способ как-то улучшить концепцию правильного выбора неконстантного метода? Моя первоначальная идея заключалась в том, чтобы получить типы аргументов через другой шаблон из переданного обратного вызова, но компилятор жаловался на неполный тип при передаче lamda с auto в нем.

Подробнее здесь: https://stackoverflow.com/questions/791 ... -arguments
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»