[解決済み】テンプレートのテンプレート・パラメーターの使い方は?
2022-03-31 23:44:20
質問
C++でテンプレート・パラメータ(テンプレートをパラメータとして受け取るテンプレート)を使って、ポリシーベースのクラス設計を行う例をいくつか見ました。このテクニックには他にどんな使い道があるのでしょうか?
どのように解決するのですか?
このようにテンプレートに依存した型を持つパラメータを渡すには、テンプレート構文を使う必要があると思います。
template <template<class> class H, class S>
void f(const H<S> &value) {
}
ここです。
H
はテンプレートですが、私はこの関数で
H
.
ノート : 私は何年もc++のプログラミングをしていますが、これが必要になったのは一度だけです。めったに必要ない機能だと思います(もちろん、必要なときは便利です!)。
正直なところ、ほとんどの場合、これは必要ないのですが、例を工夫してみましょう。次のように考えてみましょう。
std::vector
はしません。
があります。
typedef value_type
.
では、ベクターの要素に対して正しい型の変数を作ることができる関数はどのように書くのでしょうか?これならうまくいくだろう。
template <template<class, class> class V, class T, class A>
void f(V<T, A> &v) {
// This can be "typename V<T, A>::value_type",
// but we are pretending we don't have it
T temp = v.back();
v.pop_back();
// Do some work on temp
std::cout << temp << std::endl;
}
ノート
:
std::vector
は、typeとallocatorという2つのテンプレート・パラメータを持っているので、その両方を受け入れる必要がありました。幸いなことに、型控除があるので、正確な型を明示的に書き出す必要はないだろう。
というように使うことができます。
f<std::vector, int>(v); // v is of type std::vector<int> using any allocator
を使うか、いっそのこと
f(v); // everything is deduced, f can deal with a vector of any type!
アップデイト
: この工夫された例も、説明的ではあるが、c++11の導入により驚くべき例ではなくなっている。
auto
. これで同じ関数が次のように書けるようになった。
template <class Cont>
void f(Cont &v) {
auto temp = v.back();
v.pop_back();
// Do some work on temp
std::cout << temp << std::endl;
}
というのが、このタイプのコードの書き方です。
関連
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] template "と "typename "キーワードはどこに、なぜ入れなければならないのですか?
-
[解決済み] C++11の'typedef'と'using'の違いは何ですか?
-
[解決済み] C++の識別子でアンダースコアを使用する場合のルールについて教えてください。
-
[解決済み] C++テンプレート関数定義の.CPPファイルへの格納
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] ある要素がstd::setに含まれているかどうかを確認する方法は?