Jas*_*n R 5 c++ functor template-meta-programming boost-proto c++03
我有一个foo()在库上下文中提供的函数.该库为此函数定义了一些重载,如:
char foo(float x, int y);
short foo(double x, char y);
Run Code Online (Sandbox Code Playgroud)
(我做了上面的参数/结果类型.要点是参数类型和重载的相应返回类型之间没有通用关系.)
这个想法是库用户可以foo()根据需要为他们自己的用户定义类型添加重载.函数重载非常容易实现.
我想foo()在Boost.Proto表达式中使函数族可用.为了做到这一点,我想我需要使用模板调用操作符将上面的内容包装在一个函数对象中:
struct foo_wrap
{
template <typename A1, typename A2>
result_type operator()(A1 a1, A2 a2) { return foo(a1, a2); }
};
Run Code Online (Sandbox Code Playgroud)
问题在于如何定义result_type.我意识到使用C++ 11和decltype()尾随函数返回类型会很容易,但我正在寻找一个C++ 03解决方案.因此,foo_wrap需要成为TR1风格的函数对象.我需要找到一种方式来定义result_type的参数类型的编译时的功能A1和A2.这不仅需要返回类型operator(),还需要TR1 result_of协议.简而言之:
您可以手动提供一个特征:
template <typename A1, typename A2>
struct foo_wrap_result;
Run Code Online (Sandbox Code Playgroud)
和
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); }
};
Run Code Online (Sandbox Code Playgroud)
以及特征的专业化:
template <>
struct foo_wrap_result<float, int> { typedef char type; };
template <>
struct foo_wrap_result<double, char> { typedef short type; };
Run Code Online (Sandbox Code Playgroud)