gpt4 book ai didi

c++ - 确定 "generic function"的返回类型

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

假设,我想开发一个通用库,它应该可用于类似数字的类型,包括 double 类型和用户定义类型。我现在面临的问题是我不知道如何像这样编写函数模板的返回类型:

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 )

因为这对 double 不起作用,因为 std::abs 不在范围内(据我所知)。但是写

-> decltype( std::abs(x)+2.0 )

将禁用 ADL。但是禁用 ADL 不是一个选项。此外,专门的 abs 函数返回的值可能不是 T 类型,而是其他类型。

关于如何解决返回类型问题的任何想法,同时 (a) 保持 ADL 和 (b) 为不提供专门 abs 的类型回退一些默认函数(如本例中的 std::abs )。

最佳答案

使用单独的命名空间,您可以在其中放置 using 子句。这可以防止 namespace 污染,因为 using 子句仅适用于该 namespace 。我建议将其命名为独特的名称,这样您就不会不小心将其传播开来。

namespace transmog_detail
{
using std::abs;

template<class T>
auto transmogrify(T x) -> decltype(abs(x) + 2.0)
{
return abs(x) + 2.0;
}
}

// Then pull it into the current namespace, as recommended by @LucDanton.
using transmog_detail::transmogrify;

// Or if there is a reason, you can forward.
// template<class T>
// auto transmogrify(T x)
// -> decltype(transmog_detail::transmogrify(x))
// {
// return transmog_detail::transmogrify(x);
// }

关于c++ - 确定 "generic function"的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12218924/

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