这应该是微不足道的,比如
template<typename T>
T & as_is(T & t) { return t; }
尽管如此,我还是不想写它(:
我在www.cplusplus.com上找不到这样的东西。
对于那些会问“你想做什么”的人来说,就是这样。我有一个构建ascii表的类,有很好的填充和一切。我会遗漏细节。重要的是它存储字符串(因此它能够计算填充多少)。我想实现一个sort函数,并能告诉该类将该列用作某种类型。如果我想按一列int(也就是内部字符串)进行排序,我会通过atoi
。如果排序字符串,我想传递as_is
或stl等价物,如果有的话。
答案 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>
(至少存在。)
不是很好的答案,我知道......但评论太长了。