5

我有一个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参数类型A1A2. 这不仅需要 的返回类型operator(),而且 TR1result_of协议也需要。简而言之:

  • 有没有一种元编程技术,给定一个函数名和一组参数类型,将产生函数对应的返回类型?
  • 或者,是否有另一种技术可以用来用通用函数对象包装函数的多个重载?
4

1 回答 1

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; };
于 2014-12-20T00:07:47.730 回答