给定一个可调用对象(一个函数)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
没有任何运气。
重载解析过程在编译时如何工作?
如果有人想知道我为什么要尝试对此进行创意,那是我正在尝试以可行/简洁的方式在 C++11 中实现一些 Currying。