是否存在只返回其参数的std函数

Is there an std function that only returns its parameter?

本文关键字:std 函数 参数 存在 返回 是否      更新时间:2023-10-16

实现起来应该很简单,比如

template<typename T>
T & as_is(T & t) { return t; }

尽管如此,我还是不想写它(:

我在www.cplusplus.com上没有找到这样的东西。

对于那些会问"你想做什么"的人来说,事情是这样的。我有一个类,它用漂亮的填充和所有的东西来构建ascii表。我不谈细节。重要的是它存储字符串(这样它就可以计算要填充多少)。我想实现一个排序函数,并能够告诉类将列用作某个类型。如果我想按一列int(同样是内部字符串)排序,我会传递atoi。如果对字符串进行排序,我希望传递as_is或stl等价项(如果有的话)。

为什么不重载函数而不传递任何东西?

顺便说一句,如果你使用的是MSVC,他们有identity类模板,它有一个重载的operator(),返回输入。所以理论上,你可以通过std::identity<std::string>(),但我想说,只需要构建你自己的identity函数。

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

table.SortColumnUsing(3, nonstd::identity<std::string>);

这对我来说似乎有点难看,因为模板专用化中的类型是表的内部实现的一个特性,而不是与我希望表序列化为的类型有关,以便进行排序。或者,您可能并没有真正将列存储为std::string。

atoi作为类型描述符是如何工作的?atoi需要一个char*,而不是std::字符串,而且我认为您不能将int(const char*)隐式转换为int(const std::string&)。即使你可以这样做,你使用什么类型的int(const std::string&)Banana(const std string&)。也许我不完全理解你问题的上下文,或者你有一些C++技巧,我很想学习。

我倾向于传递比较函数,而不是转换函数。这将导致一个单一的常量函数类型,可能是bool(const std::string&, const std::string&)。这也可能使实现更简单,例如,对特定列进行不区分大小写或特定于区域设置的字符串比较,或者其他方便用户界面的排序技巧(比如将文件夹放在列表的顶部:首先检查是否只有一个字符串有尾随/,否则使用标准比较。)不过,这并不能真正解决专业化问题;对于std::string的情况,您仍然会得到std::less<std::string>(它至少存在)

不是一个好答案,我知道。。。但时间太长,无法发表评论。