【发布时间】:2012-08-31 16:03:23
【问题描述】:
假设,我想开发一个通用库,它应该可以用于类似数字的类型,包括双精度类型和用户定义类型。我现在面临的问题是我不知道如何编写函数模板的返回类型,就像这样:
template<class T>
auto transmogrify(T x)
-> ???
{
using std::abs;
return abs(x)+2.0;
}
using 声明使此函数模板的主体适用于原始类型,因为它们没有关联的命名空间(因此,没有 ADL)。但是我希望 transmogrify 使用专门的 abs 函数,以防用户定义类型的作者提供他自己的 abs 函数。我不能简单地使用
-> decltype( abs(x)+2.0 )
因为这不适用于双打,因为 std::abs 不在范围内(据我所知)。但是写
-> decltype( std::abs(x)+2.0 )
将禁用 ADL。但禁用 ADL 不是一种选择。此外,专门的 abs 函数返回的值可能不是 T 类型,而是其他类型。
关于如何解决返回类型问题的任何想法,同时 (a) 保留 ADL 和 (b) 对于不提供专用 abs 的类型使用某些默认函数(如本例中的 std::abs)。
【问题讨论】:
-
#define ab using std::abs; your_template_fn #undef ab不知道这是不是个好选择 -
@Mr.Anubis 以及如何使用此定义确定函数的返回类型?
-
我猜
-> decltype( abs(x)+2.0 ) -
就在函数def之前,我猜也使用它?顺便说一句,你的眼睛怎么了? :P
-
A similar problem 可以类似解决。
标签: c++ c++11 generic-programming decltype argument-dependent-lookup