Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 确定“的退货类型”;“通用函数”;_C++_C++11_Generic Programming_Decltype_Argument Dependent Lookup - Fatal编程技术网

C++ 确定“的退货类型”;“通用函数”;

C++ 确定“的退货类型”;“通用函数”;,c++,c++11,generic-programming,decltype,argument-dependent-lookup,C++,C++11,Generic Programming,Decltype,Argument Dependent Lookup,假设,我想开发一个泛型库,它应该可以用于类似数字的类型,包括double和用户定义的类型。我现在面临的问题是,我不知道如何编写函数模板的返回类型,就像这样: template<class T> auto transmogrify(T x) -> ??? { using std::abs; return abs(x)+2.0; } 因为这对double不起作用,因为std::abs不在范围内(据我所知)。但是写作 -> decltype( std::abs

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

template<class T>
auto transmogrify(T x)
-> ???
{
    using std::abs;
    return abs(x)+2.0;
}
因为这对double不起作用,因为std::abs不在范围内(据我所知)。但是写作

-> decltype( std::abs(x)+2.0 )
将禁用ADL。但禁用ADL不是一个选项。此外,专用abs函数返回的值可能不是T类型,而是其他类型


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

使用单独的名称空间,您可以在其中放置using子句。这可以防止名称空间污染,因为using子句只适用于该名称空间。我建议给它起个独特的名字,这样你就不会不小心把它传播开来

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);
// }
名称空间转换详细信息
{
使用std::abs;
模板
自动变形(T x)->变形(abs(x)+2.0)
{
返回abs(x)+2.0;
}
}
//然后按照@LucDanton的建议将其拉入当前名称空间。
使用transmog_detail::transmogrify;
//或者如果有原因,你可以转发。
//模板
//自动变形(T x)
//->decltype(transmog_细节::transmogrify(x))
// {
//返回transmog_detail::transmogrify(x);
// }

上面的答案很好,但我能想到的最简单的方法是使用typeinfo标题。它是专门为确定对象的类型和构造函数而设计的


请参见此处:

#使用std::abs定义ab;您的_template_fn#undef ab
不确定这是否是一个好的选择do@Mr.Anubis那么如何使用这个定义来确定函数的返回类型呢?我想在函数def之前使用decltype(abs(x)+2.0),顺便问一下,你的眼睛怎么了P同样可以解决。非常聪明!未命名的名称空间可能会也可能不会使其更干净。不确定。@MooingDuck:可能是,也可能不是。如果您使用任何其他未命名的名称空间,它们也会有using子句,这可能是不可取的。-1一点也不有用-type_info是关于运行时类型标识的,而声明需要静态确定的类型。
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);
// }