我有一个函数foo()
,它是在库的上下文中提供的。该库为此函数定义了一些重载形式,如:
char foo(float x, int y);
short foo(double x, char y);
我编写了上面的参数/结果类型。重点是,参数类型与重载函数对应的返回类型之间没有通用关系。
这个想法是,库用户可以根据需要为他们自己定义的用户类型添加
foo()
的重载。函数重载非常容易实现这一点。我希望使
foo()
函数族可在Boost.Proto表达式中使用。为此,我认为我需要使用模板调用运算符将上述内容包装在函数对象中:struct foo_wrap
{
template <typename A1, typename A2>
result_type operator()(A1 a1, A2 a2) { return foo(a1, a2); }
};
问题在于如何定义
result_type
。我意识到使用C++11以及decltype()
和尾随函数返回类型会很容易,但是我正在寻找一个C++03的解决方案。因此,foo_wrap
需要是一个TR1风格的函数对象。我需要找到一种方法,将result_type
定义为参数类型A1
和A2
的编译时函数。这不仅适用于operator()
的返回类型,也适用于TR1的result_of
协议。简而言之:
- 是否存在元编程技术,可以根据函数名和一组参数类型,得出该函数对应的返回类型?
- 或者,是否有其他技术可以用来包装一个具有多个重载的函数,并使其成为通用函数对象?
typeof()
功能。 - cdhowiedecltype
,所以可能可以完成工作。看起来它也适用于 clang,这很好。拥有更标准的技术会更好,但我怀疑可能没有。 - Jason Rfoo_wrap::result<>
的特化(根据TR1协议需要),除了函数签名之外。类似这样:DECL_FUNC_OVERLOAD(foo, char, float, int) { /* implementation here */ }
。 - Jason R