如何使用通用TR1函数对象包装多个函数重载?

时间:2014-12-19 19:21:04

标签: c++ functor template-meta-programming c++03 boost-proto

我有一个在库上下文中提供的函数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定义为参数类型A1A2的编译时函数。这不仅需要operator()的返回类型,还需要TR1 result_of协议的返回类型。简而言之:

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

1 个答案:

答案 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; };