C++ 是否有只返回其参数的std函数?

C++ 是否有只返回其参数的std函数?,c++,stl,C++,Stl,这应该很容易实现,比如 template<typename T> T & as_is(T & t) { return t; } 模板 T&as_是(T&T){返回T;} 尽管如此,我还是不想写它(: 我没有在衣服上发现这样的东西 对于那些会问“你想做什么”的人来说,我有一个类,它可以构建ascii表,有很好的填充和所有东西。我不想透露细节。重要的是它存储字符串(因此它能够计算填充多少)。我想实现一个排序函数,并能够告诉类将列用作特定类型。如果我想按int列排序(同

这应该很容易实现,比如

template<typename T>
T & as_is(T & t) { return t; }
模板
T&as_是(T&T){返回T;}
尽管如此,我还是不想写它(:

我没有在衣服上发现这样的东西


对于那些会问“你想做什么”的人来说,我有一个类,它可以构建ascii表,有很好的填充和所有东西。我不想透露细节。重要的是它存储字符串(因此它能够计算填充多少)。我想实现一个排序函数,并能够告诉类将列用作特定类型。如果我想按int列排序(同样,int也是内部字符串),我将传递
atoi
。如果对字符串进行排序,我希望按原样传递
,或者传递stl等价物(如果有)。

为什么不重载函数,不传递任何内容


顺便说一句,如果你在使用MSVC,他们有
identity
类模板,它有一个重载的
操作符()
,返回输入。因此理论上,你可以传递
std::identity()
,但我要说的是,只需构建您自己的
标识
函数。

您不能像传递函数一样传递模板,因此std::forward和假设的nonsd::identity函数都不能按原样工作。您需要显式设置转换的目标类型:

table.SortColumnUsing(3, nonstd::identity<std::string>);
table.SortColumnUsing(3,nonsd::identity);
这对我来说似乎有点难看,因为模板专门化中的类型是表的内部实现的一个功能,而不是与我希望表序列化为的类型有关,以便进行排序。或者,您可能没有真正将列存储为std::string

atoi是如何作为一个类型描述符工作的?atoi需要一个char*,而不是std::string,我不认为您可以隐式地将
int(const char*)
转换为
int(const std::string&)
。即使您可以这样做,您使用什么类型可以同时存储
int(const std::string&)
(const STD string)。也许我不完全理解你的问题的上下文,或者你有一些C++技巧在我的袖子上,我很想学习。 我倾向于传递一个比较函数而不是转换函数。这将导致一个单一的常量函数类型,可能是
bool(const std::string&,const std::string&)
。这也可能使实现更简单,例如,对特定列进行不区分大小写或特定于语言环境的字符串比较,或其他方便用户界面的排序技巧(如将文件夹放在列表顶部:首先检查是否只有一个字符串有尾随/,否则使用标准比较。)但是,这并不能真正解决专门化问题;对于
std::string
情况,您仍然会得到
std::less
(至少存在)


这不是一个很好的答案,我知道……但它太长了,无法发表评论。

很有趣。看起来标识不是MS特有的:重载意味着复制一些代码。为了避免重复,不带参数的重载将调用带参数的版本,给出标识。这将提供方便的方法,增加复杂性,同时又不增加复杂性添加任何功能。@Gabriel它出现在最新标准的较旧草案中,但已被删除。您在GCC 4.6中找不到它。也许
std::forward
满足这些要求?@Kerrek:这是一个很好的方法,尽管它要求您详细说明模板参数。这是一个很好的答案,因为它是针对原因而不是问题。传递将函数转换为按“整数顺序”排序听起来很糟糕,因此建议使用比较函数时使用+1。实际上,我正在将比较函数传递给当前排序函数。由于构造过于冗长,我希望(ed)将其删除。也就是说,我忘了我还必须
.c_str()
函子的
atoi
中的字符串,这将阻止将其按原样传递给排序函数,从而破坏示例。