テンプレートを関数であるかのように渡すことはできないため、std::forward関数も仮想のnonstd::Identity関数も(そのままでは)機能しません。変換のターゲットタイプを明示的に設定する必要があります。
table.SortColumnUsing(3, nonstd::identity<std::string>);
テンプレートの特殊化の型は、並べ替えの目的でテーブルがシリアル化されることを期待している型とは関係がなく、テーブルの内部実装の機能であるため、これは少し醜いようです。または、列をstd::stringとして実際に保存していない可能性があります。
atoiはタイプ記述子としてどのように機能しますか?int(const char*)
atoiはstd::stringではなくchar*を期待しており、暗黙的にに変換できるとは思いませんでしたint(const std::string&)
。それができたとしても、int(const std::string&)
との両方を保存できるタイプを使用しますBanana(const std string&)
。おそらく私はあなたの質問の文脈を完全に理解していないか、あるいはあなたは私が学びたいと思っているいくつかのC++のトリックを持っています。
私の傾向は、変換関数ではなく比較関数を渡すことです。その結果、単一の定数関数型、おそらくbool(const std::string&, const std::string&)
。これにより、実装が簡単になる場合もあります。特定の列の大文字と小文字を区別しない、またはロケール固有の文字列比較、またはその他のUIに便利な並べ替えハック(リストの一番上にフォルダを配置するなど:最初に文字列の1つだけに末尾の/があるかどうかを確認します。それ以外の場合は標準の比較を使用します)。ただし、それは専門化の問題を実際には解決しません。このstd::string
場合、あなたはまだstd::less<std::string>
(少なくとも存在します)になります。
良い答えではありません、私は知っています...しかし、コメントするには長すぎました。