Как я могу получить тип функции из выражения вызова? - PullRequest
0 голосов
/ 11 февраля 2019

Я хочу сделать модульный тест, чтобы проверить (и узнать, как работает разрешение функций), для перегрузки функций, которые принимают lvalue вместо ссылки const lvalue для примитивных типов в некоторых математических функциях, вызывается хорошая функция.Я не нашел никакого обычного паттерна об этом.

struct A {/* ... */};

A f(A) {} // #1
A&& f(A&&) {} // #2
// Or some very complicated template overloading

int main() {
    f(A()); // call #2 ; How to get it ?
}

// I want to have:
// typeid(f).name();

Возможно ли получить typeid(f) из context во время компиляции?(как жалуется gcc s)

"Псевдокод":

std::cout << typeid(f with args A()).name() << std::endl 
// >> "A&& f(A&&)"   (#2)

Только с компилятором typeid(f) (gcc 7.3.0 на Ubuntu x64)

/home/xyzz/project/tests/RunTests.cpp:22: erreur : overloaded function with no contextual type information
     typeid(tst).name();
            ^~~

При typeid(f()) он возвращает возвращаемый тип

Предлагаемый ответ: std::result_of.Параметры шаблона не перестраиваются, но мы можем получить тип функции.

1 Ответ

0 голосов
/ 11 февраля 2019

Следующее, похоже, работает на моей машине.Насколько это близко к тому, что вы хотите?

    std::cout
      << typeid( static_cast<void (*)(A)>(f) ).name() << std::endl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...