Использование std::result_of с перегруженным методом

Я добавил в существующий класс перегруженный метод, который теперь вызывает ошибку компиляции в наших модульных тестах.

Я воспроизвел проблему с помощью следующего кода:

#include <type_traits>
#include <string>

class Foo
{
    public:
    Foo() {};
    int bar(const std::string & s) {return 1;};
    int bar(const std::string & s, long l) {return 2;};
    int bar2(const std::string & s) {return 3;};
};

int main()
{
    // compiles
    std::is_same<std::result_of<decltype(&Foo::bar2)(Foo, const std::string &)>::type, int>::value;

    // does not compile
    std::is_same<std::result_of<decltype(&Foo::bar)(Foo, const std::string &)>::type, int>::value;
    return 0;
}

Какие изменения мне нужно внести в строку, которая не компилируется, чтобы я мог протестировать возврат перегруженного метода?


person Class Skeleton    schedule 01.03.2017    source источник
comment
stackoverflow.com/q/22291737/1460794   -  person wally    schedule 01.03.2017
comment
@Muscampester спасибо, принятый ответ помог мне понять комментарий Петра выше.   -  person Class Skeleton    schedule 01.03.2017
comment
Также полезно: arne-mertz.de/2017/01/decltype-declval   -  person Class Skeleton    schedule 01.03.2017
comment
@PiotrSkotnicki Я думаю, что публикация комментария в качестве ответа оправдана.   -  person wally    schedule 01.03.2017


Ответы (1)


Имя перегруженной функции представляет все перегрузки, каждая из которых имеет собственный адрес. Таким образом, он не может быть разрешен для определенной перегрузки, если не существует поддерживающего контекста, например, используется статическое приведение:

static_cast<int(Foo::*)(const std::string&)>(&Foo::bar)

Это, однако, требует, чтобы вы знали точную подпись, что противоречит цели поиска возвращаемого типа. Вместо этого вы можете запросить возвращаемый тип, используя спецификатор decltype и вспомогательную функцию declval:

std::is_same<decltype(std::declval<Foo&>().bar("")), int>::value
person Piotr Skotnicki    schedule 01.03.2017