gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:24 26 4
gpt4 key购买 nike

我有一个函数 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() 的返回类型所必需的,也是 TR1 result_of 协议(protocol)正常工作所必需的。简而言之:

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

最佳答案

您可以为此手动输入特征:

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

关于c++ - 如何用通用 TR1 函数对象包装多个函数重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27572588/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com