テンプレートプログラミングをC++で教えているので、私の前提のいくつかが間違っている可能性があります。テンプレートテンプレートをテンプレートに含めることを特化する
STLリストを関数のテンプレートパラメータとして使用しようとしています。この関数はあらゆる種類のデータ型で使用されるはずですので、元の宣言でtemplate<template<> class T>
ではなく関数をtemplate<class T>
と定義しました。私は今、それをテンプレートクラスをサポートするように特化したいと思っています。
template<class T>
void function(T param)
{
// do something with T
}
template<template <class T, class Allocator> class listPlaceholder>
void function(std::list<T, Allocator> param)
{
// do something with every element in param (I actually need to know it's a list)
std::list<T, Allocator>::iterator current = param.begin();
std::list<T, Allocator>::iterator end = param.end();
do {
function<T>(*current);
} while (++current != end);
}
の問題は、私はそれがT
とAllocator
は、スコープで定義されていないことを述べている(GCCの下で)このコードをコンパイルしようとします。私の主な質問は、 "私はどのようにテンプレートクラスを専門にするのですか?"第2に、可能であれば、「どのようにテンプレートテンプレートパラメータを抽出するのですか?」
前述のように、私はテンプレートプログラミングを学んでいるので、明白な解決策は大歓迎です。
他の2つのパラメータテンプレートクラスを開いたままで、 'std :: list'を特化するために' listPlaceholder'と 'std :: list'を使いました(例えば私も' std :: pair'を使っています) 。他のコメント作成者に言及したように、追加のテンプレートパラメータは、元の関数でこの変更された関数を使用できないことを意味します。 – fuseinabowl
@fuseinabowl、そうですね。まあ、あなたが専門ではないので、あなたはそれをもっと専門にするために "開いたままにする"必要はありません。パラメータ化された 'std :: list 'の関数テンプレートは、関数テンプレートに対しては実行できない部分的な特殊化を必要とするため、特殊化できませんでした。 'std :: list'をそこに貼り付けるだけで、後で他のタイプのオーバーロードを追加することができます。コンパイラーは、コールで最も特殊なテンプレートを選択します(つまり、最も近いものが引数にマッチします)。 –
私はまずそれを試しました - 私はそれをコード化する方法を正確にはうまくいけませんでした。私にテンプレート関数宣言のコードサンプルを教えてもらえますか? – fuseinabowl