2011-01-18 9 views
4

STLのベクトルテンプレート引数のテンプレートを特殊化したいと考えています。このようなもの:is_stl_vectorの実装方法

// (1) 
template <typename T> 
class A 
{ 
    ... 
}; 

// (2) 
template <> 
class A<std::vector<> > 
{ 
    ... 
}; 

どのようなベクトル要素の種類は気にしません。一般的に

A<int> a1; // Will use the general specialization 
A<std::vector<int> > a2; // Will use the second specialization 

を私はブーストのタイプの特徴に似た何かを定義しようとしてきた:私は次のようにそれを使用したいと思います。それはあまりにも非テンプレートタイプ用にコンパイルする必要があるため

template <class T> 
struct is_stl_vector 
{ 
    // Will be true if T is a vector, false otherwise 
    static const bool value = ...; 
}; 

のようなものは、私は(私はそう思う)テンプレートテンプレートを使用することはできません。まったく可能ですか?

+3

'のstd :: vector'は、C++標準ライブラリではなく、STLからです。 –

+0

@トマラク:何ですか? 'std :: vector'はSTLからのものではありませんか? STLとは何ですか? – Nawaz

+0

@Tomalak: 'std :: vector'は、[STL](http://en.wikipedia.org/wiki/Standard_Template_Library)の一部としてC++標準ライブラリに含まれています。それは実際には両方からです。 –

答えて

7

あなたは、単にこのように特化することができます

// (2) 
template <typename T, typename Alloc> 
struct A<std::vector<T, Alloc> > 
{...}; 
+2

これは単純ではないことを除いて、+1を得るでしょう。 jpalecekの答えを参照してください。 –

+0

@Tomalak Geret'kal:実際には、さまざまなテンプレートパラメータの数に問題はないはずです。これは、std :: vector がデフォルトのテンプレート引数を使用する必要があるからです(これは、テンプレートにテンプレート型を使用するのとは異なり、正確な宣言が必要です)。私のコンパイラは、テンプレートAA > {...}でもこの作業をすることで私に同意しているようです。もちろん、それ以外のテンプレートパラメータにデフォルト以外の引数を使用するベクトルとは一致しませんが、まれに発生する可能性は低いです。私がここで間違っているなら、私を修正してください。 – Grizzly

+0

@Tomalak:実際、これは簡単です。 jpalecekの答えに対する私のコメントを見てください。 –

6

特殊化はこのように書きます:std::vectorのテンプレートパラメータ数が実装ごとに異なる可能性があるので、(特に動作を保証するだ他に方法がSIん)の動作が保証されていない

// (2) 
template <class T, class U> 
class A<std::vector<T, U> > 
{ 
    ... 
}; 

注こと。 C++ 0xでは、これはパラメータパックを使用して解くことができます。

+0

これは、標準の値を持っていても、適合するstd :: vectorが型とアロケータのテンプレートパラメータ以外を持つことができないということです。しかし、私はあなたが上記のコードが失敗する実装を見つけることが非常に難しいと思います。 –

+0

@Fred Nurk:章と節? 'float(* pSin)(float)=&std :: sin'は' float std :: sin(float) 'に余分なデフォルト引数があるときに壊れます。 – MSalters

+0

@MSalters:C++ 03§1.4p2 "プログラムがこの国際規格の規則に違反していない場合、適合する実装は、そのリソース制限内で、そのプログラムを受け入れ正しく実行するものとする。 §1.4p8「適合する実装は、適切な形式のプログラムの動作を変更しない限り、拡張機能(追加のライブラリ機能を含む)を持つことができる」そして、はい、これは通常の関数に適用され、実際にはstdlib全体に適用されます。 –