について考えていpartial specializationます。アイデアは理解できますが、この手法が実際に使用されているのを見たことがありません。Full specialization色々なところに使われているSTLので問題ありません。が使用されている実際の例について教えていただけますpartial specializationか? その例があれば、STL優れているでしょう!
3 に答える
C++0x には、廃止予定unique_ptrの代替品が付属しています。auto_ptr
unique_ptr配列型で使うとdelete[]解放したり、提供しoperator[]たりなどに使います。非配列型で使うと を使いdeleteます。これには、次のような部分的なテンプレートの特殊化が必要です
template<typename T>
struct my_unique_ptr { ... };
template<typename T>
struct my_unique_ptr<T[]> { ... };
別の用途 (非常に疑問ですが) はstd::vector<bool, Allocator>、標準ライブラリにあります。bool の特殊化は、空間の最適化を使用して bool を個々のビットにパックします。
template<typename T, typename Allocator = std::allocator<T> >
struct vector { ... };
template<typename Allocator>
struct vector<bool, Allocator> { ... };
さらに別の用途はstd::iterator_traits<T>です。ネストされた typedef を定義するには反復子が必要value_typeでreferenceあり、他のものは正しい型 (たとえば、定数反復子の場合referenceは通常T const&) を定義する必要があるため、アルゴリズムはそれらを作業に使用できます。プライマリ テンプレートは、反復子型の型メンバーを順番に使用します
template<typename T>
struct iterator_traits {
typedef typename T::value_type value_type;
...
};
ポインターの場合、もちろん機能しません。それらには部分的な専門化があります
template<typename T>
struct iterator_traits<T*> {
typedef T value_type;
...
};
一部のstl実装では、コレクションは、部分的なテンプレートの特殊化std::vectorをstd::list使用して、ポインターのコレクション用に生成されるコードの量を減らします。
タイプTのテンプレートをインスタンス化するたびに、新しいコードが作成されます。ただし、ポインタの型は事実上すべて同じであるため、すべての型に対して新しいコードを生成するのは無駄です。これは、voidポインターを使用してポインター・コレクションのプライベート部分を実装し、パブリック・インターフェースでこれらを適切なタイプにキャストすることで減らすことができます。これにより、ポインターコレクション用に生成されるコードが大幅に削減されます。
これはEffectiveSTLでカバーされていると思います。
MSDN から取得 (クラス テンプレートの部分的な特殊化 (C++))
// partial_specialization_of_class_templates.cpp
template <class T> struct PTS {
enum {
IsPointer = 0,
IsPointerToDataMember = 0
};
};
template <class T> struct PTS<T*> {
enum {
IsPointer = 1,
IsPointerToDataMember = 0
};
};
template <class T, class U> struct PTS<T U::*> {
enum {
IsPointer = 0,
IsPointerToDataMember = 1
};
};