Можно ли получить decltype функции, которая будет вызываться в соответствии с ADL? - PullRequest
0 голосов
/ 29 июня 2018

Здесь есть сообщение с просьбой о том, что я считаю эквивалентным для моих целей (адрес функции, а не тип), но этому вопросу уже 5 лет; единственный ответ утверждает, что не может быть правильного решения - без указания конкретной причины - и предлагает частичное решение, требующее новой функции, явно вызывающей каждую рассматриваемую функцию ADL, просто для использования лямбда-семантики.

template <typename T>
void (*get_swap())(T&, T&) {
    return [](T& x, T& y) { return swap(x, y); };
}

Я мог бы сделать это несколько более общим:

template<typename... T>
void (*get_func())(T &&... t) {
    return [](T &&... u) { return func(std::forward<T>(u)...); };
}

Очевидно, func также должен быть аргументом - потенциально аргументом шаблона - но это начинает разрушаться.

template<typename S, typename... T>
void (*get_func())(S (*func)(T &&...), T &&... t) {
    return [](T &&... u) { return func(std::forward<T>(u)...); };
}

Ответ переходит к использованию get_swap примерно так:

auto f1 = get_swap<a::b>();

Кажется, что это конец пути: f1 набирается явным созданием функции; ADL выходит из окна.

Рассмотрим std::make_tuple: вы уже знаете, что std::make_tuple<T...> вызывается на T &&... t и что вызов std::make_tuple(std::forward<T>(t)...) эквивалентен явному созданию его экземпляра на T.... Что если ты этого не знал? Возможно, некоторые из аргументов шаблона являются значениями, или аргументы упакованы каким-либо образом, или лучший кандидат включает в себя дополнительные аргументы со значениями по умолчанию. Возможно, вы могли бы привести аргумент в пользу RTFM или ожидания того, что какая-то концепция рефлексии пойдет по конвейеру, но я думаю, что это правильный вопрос; очевидно, компилятор знает адрес и тип функции, которую он разрешает через ADL. Если бы я добавил это как функцию, я бы не знал, с чего начать с точки зрения синтаксиса (хотя я ожидал бы, что он будет следовать declval и decltype, как, возможно, declfunc, возвращая тип самого внешнего вызова. )

В двух словах, я ищу способ спросить: "Как бы вы назвали, если бы я представил эти аргументы?" и / или "какой тип того, что вы бы назвали (...)".

Meta: я намеренно пропустил теги, зависящие от версии, на случай, если решение может существовать в более новой версии (или в предложении и т. Д.). Для чего бы то ни было, я использую C ++ 14, основанный на основном C ++ 11. Это академический интерес, по крайней мере, на данный момент. Кроме того, я стремился к нейтральному тону, но если это прозвучало иначе, я не собираюсь пренебрегать автором цитируемого мной ответа.

1 Ответ

0 голосов
/ 29 июня 2018

Нет, C ++ не раскрывает это.

Если бы у вас был практический пример использования, люди могли бы предложить обходные пути или решения этой проблемы. Но поскольку вы запрашиваете очень специфическую функцию в аннотации, ответ на C ++ не обеспечивает эту особенность.

Вы могли бы, вероятно, переписать компилятор, чтобы сделать это, но тогда это больше не будет C ++.

...