Использование 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;
}

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

1 ответ

Решение

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

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

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

std::is_same<decltype(std::declval<Foo&>().bar("")), int>::value
Другие вопросы по тегам