您不能像传递函数一样传递模板,因此 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>
(至少存在。)
我知道,这不是一个很好的答案……但是评论太长了。