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