Учитывая вызываемый объект (функция) a
, и аргумент b
(или ряд аргументов), я хотел бы вывести тип, возвращаемый из f
считая, что f
перегружен множеством подписей ,Выведение типа для перегруженных функций - выделки
один из моих многочисленных попыток
#include <iostream>
#include <cstdint>
#include <string>
#include <functional>
#include <utility>
#include <typeinfo>
int foo(uint32_t a) { return ((a + 0) * 2); }
bool foo(std::string a) { return (a.empty()); }
/*template <typename A, typename B> auto bar(A a, B b) -> decltype(a(b)) {
return (a(b));
}*/
/*template <typename A, typename B> decltype(std::declval<a(b)>()) bar(A a, B b)
{
return (a(b));
}*/
template <typename A, typename B> void bar(std::function<A(B)> a, B b) {
std::cout << a(b) << "\n";
}
int main() {
// the following 2 lines are trivial and they are working as expected
std::cout << foo(33) << "\n";
std::cout << typeid(decltype(foo(std::string("nothing")))).name() << "\n";
std::cout << bar(foo, 33) << "\n";
//std::cout << bar(foo, std::string("Heinz")) << "\n";
return (0);
}
и 2 шаблоны опций закомментирована и включены в предыдущем коде.
Я использую declval result_of auto decltype
без везения.
Как работает процесс перегрузки при компиляции?
Если кто-то хочет знать, почему я пытаюсь проявить творческий подход к этому, это то, что я пытаюсь реализовать некоторые Currying в C++ 11 в работоспособном/опрятном виде.
Я не уверен, понимаю ли вы то, о чем вы спрашиваете, вы имеете в виду: Как я могу указать возвращаемый тип f() с учетом аргументов? – ScarletAmaranth
@ScarletAmaranth yep – user2485710
Что не так с 'decltype (f (b))'? – Casey