invoke_result с функцией member (operator []) - PullRequest
0 голосов
/ 06 июля 2019

Как правильно вызвать invoke_result для функции-члена? Или специально для функции-члена оператора. Я пытался std::invoke_result<T::operator[], size_type> безуспешно. Какой будет правильный синтаксис в этом случае?

Ответы [ 2 ]

2 голосов
/ 06 июля 2019

Не. Используйте decltype(std::declval<T&>()[size_type{}]) или что-то подобное (при необходимости измените категорию значения и квалификацию cv).

invoke_result для случаев, когда у вас есть вызываемый / вызываемый объект. У вас его нет, поэтому не пытайтесь вбивать квадратные колышки в круглые отверстия.

1 голос
/ 06 июля 2019

Как насчет следующего?

std::invoke_result<decltype(&T::operator[]), T, size_type>

Но этот синтаксис должен работать с одним, а не с шаблоном, operator[].

В случае шаблона или перегрузки следует избегатьstd::invoke_result и следует по пути decltype(), предложенному TC

Или, может быть, вы можете заключить вызов в лямбда-функцию и применить std::invoke_result к лямбде (если вы действительно, действительно хотите использовать std::invoke_result).

Что касается синтаксиса std::invoke_result, учтите, что указатель на функцию-член - это совершенно разные вещи по сравнению с указателем на обычную функцию.В любом случае, вы можете грубо видеть его как указатель на обычную функцию, получающую дополнительный аргумент (в первой позиции), соответствующий объекту, который вызывает его метод.

Итак, в вашем примере первый аргумент Tпредставляют объект типа T, вызывающий его оператор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...