我有一个在库上下文中提供的函数foo()
。该库为此函数定义了一些重载,例如:
char foo(float x, int y);
short foo(double x, char y);
(我提出了上面的参数/结果类型。重点是参数类型和重载的相应返回类型之间没有通用关系。)
这个想法是库用户可以根据需要为他们自己的用户定义类型添加foo()
的重载。函数重载很容易实现这一点。
我想在Boost.Proto表达式中使foo()
系列函数可用。为了做到这一点,我想我需要使用模板调用操作符将上面的内容包装在一个函数对象中:
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
协议的返回类型。简而言之:
答案 0 :(得分:4)
您可以手动输入特征:
template <typename A1, typename A2>
struct foo_wrap_result;
与
struct foo_wrap
{
template <typename A1, typename A2>
typename foo_wrap_result<A1, A2>::type
operator()(A1 a1, A2 a2) const { return foo(a1, a2); }
};
特征的特化:
template <>
struct foo_wrap_result<float, int> { typedef char type; };
template <>
struct foo_wrap_result<double, char> { typedef short type; };