Здесь есть сообщение с просьбой о том, что я считаю эквивалентным для моих целей (адрес функции, а не тип), но этому вопросу уже 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. Это академический интерес, по крайней мере, на данный момент. Кроме того, я стремился к нейтральному тону, но если это прозвучало иначе, я не собираюсь пренебрегать автором цитируемого мной ответа.