5

実装するのは簡単なはずです。

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

それでも、私はそれを書く必要はありません(:

www.cplusplus.comでそのようなものは見つかりませんでした。

「何をしようとしているのか」と尋ねる人のために、ここにあります。素敵なパディングとすべてを備えたASCIIテーブルを作成するクラスがあります。詳細は割愛します。重要なのは、文字列を格納することです(つまり、パディングする量を計算できます)。ソート関数を実装し、列を特定の型として使用するようにクラスに指示できるようにしたい。intの列(これも内部的には文字列です)で並べ替える場合は、を渡し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>);

テンプレートの特殊化の型は、並べ替えの目的でテーブルがシリアル化されることを期待している型とは関係がなく、テーブルの内部実装の機能であるため、これは少し醜いようです。または、列を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>(少なくとも存在します)になります。

良い答えではありません、私は知っています...しかし、コメントするには長すぎました。

于 2012-09-26T22:30:13.217 に答える