实现这一点应该是微不足道的
template<typename T>
T & as_is(T & t) { return t; }
Run Code Online (Sandbox Code Playgroud)
不过,我还是不想写它(:
我在www.cplusplus.com上找不到这样的东西.
对于那些会问"你想做什么"的人来说,就是这样.我有一个构建ascii表的类,有很好的填充和一切.我会遗漏细节.重要的是它存储字符串(因此它能够计算填充多少).我想实现一个sort函数,并能告诉该类将该列用作某种类型.如果我想按一列整数排序(这也是内部字符串),我会通过atoi.如果排序字符串,我想传递as_is,或者stl等价物,如果有的话.
您不能像函数一样传递模板,因此 std::forward 和假设的 nonstd::identity 函数都不会按原样工作(就像以前一样)。您需要显式设置转换的目标类型:
table.SortColumnUsing(3, nonstd::identity<std::string>);
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎有点难看,因为模板专业化中的类型是表内部实现的一个功能,而不是与我期望表序列化以进行排序的类型有任何关系。或者也许您并没有真正将列存储为 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>(至少存在。)
我知道,这不是一个很好的答案……但是评论太长了。