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

时间:2012-09-26 21:40:05

标签: c++ stl

这应该是微不足道的,比如

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

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

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

对于那些会问“你想做什么”的人来说,就是这样。我有一个构建ascii表的类,有很好的填充和一切。我会遗漏细节。重要的是它存储字符串(因此它能够计算填充多少)。我想实现一个sort函数,并能告诉该类将该列用作某种类型。如果我想按一列int(也就是内部字符串)进行排序,我会通过atoi。如果排序字符串,我想传递as_is或stl等价物,如果有的话。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

你不能传递模板就好像它是一个函数一样,所以std :: forward和你假设的nonstd :: identity函数都不会按原样运行(就像它一样)。您需要显式设置转换的目标类型:

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

对我来说这看起来有点难看,因为模板特化中的类型是表的内部实现的一个特性,而不是与我期望表序列化的类型有任何关系排序。或者你可能没有真正将列存储为std :: string。

atoi如何作为类型描述符工作? atoi期望一个char *,而不是一个std :: string,我认为你不能隐含地将int(const char*)转换为int(const std::string&)。即使您可以这样做,您使用哪种类型可以同时存储int(const std::string&)Banana(const std string&)。也许我不完全理解你的问题的背景,或者你有一些我喜欢学习的C ++技巧。

我倾向于传递比较函数而不是转换函数。这将导致单个常量函数类型,可能是bool(const std::string&, const std::string&)。这也可能使实施起来更简单。特定列的字符串不敏感或特定于语言环境的字符串比较,或其他UI方便的排序黑客(如将文件夹放在列表顶部:首先检查其中一个字符串是否有尾随/,否则使用标准比较。)但这并没有真正解决专业化问题;对于std::string案例,您仍然最终得到std::less<std::string>(至少存在。)

不是很好的答案,我知道......但评论太长了。