5

这应该很容易实现,比如

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

不过,我不想写它(:

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

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

4

2 回答 2

3

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

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

于 2012-09-26T21:43:43.733 回答
2

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

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

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

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

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

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

于 2012-09-26T22:30:13.217 回答