您不能像傳遞函數那樣傳遞模板,所以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>
(至少存在)結束。
不是一個好的答案,我知道......但它太長了評論。
也許'std :: forward'滿足這些要求? –
@Kerrek:這是一個很好的例子,但它需要你拼出模板參數。 – Xeo