事前に注意してください。この質問は、実際よりもはるかに明白に思えます。
任意の具象クラスまたはテンプレート クラスをテンプレート パラメーターとして受け入れることができるテンプレートを作成したいと考えています。渡された T がテンプレート化されているかどうかを知らなければ、その使用方法がわからないため、これは役に立たないように思えるかもしれません。これが必要な理由は、定義のない一般的なテンプレートを宣言して、ユーザーが特化できるようにするためです。ユーザーはそれを専門に扱っているため、自分が扱っている型について常に知っています。ただし、ユーザーは、最初に宣言されていないテンプレートを特殊化することはできません。
あなたはこれを行うことができます:
template<class T>
class myclass;
ただし、テンプレート化された T を渡すと、それは機能しません。たとえば、機能しmyclass<std::vector>
ません。それで、これを試します:
template<class T>
class myclass;
template<template<class> T>
class myclass;
これは正しい方法かもしれませんが、クラス テンプレートをオーバーロードできないため、そのままでは機能しません。それでは、次のような関数テンプレートに切り替えましょう。
template<class T>
void myfunc();
template<template<class> T>
void myfunc();
いいですね、これで終わりですよね?テンプレートのテンプレート パラメータに指定されたパラメータの数が異なる可能性があるため、それも考慮する必要があります。
template<class T>
void myfunc();
template<template<class> T>
void myfunc();
template<template<class, class> T>
void myfunc();
template<template<class, class, class> T>
void myfunc();
// etc.
醜いですが、Boost Preprocessor Libraryがこのコードを生成してくれます (C++0x では可変個引数テンプレートのサポートが追加されるため、この醜さは一時的なものです)。しかし、私たちはまだケースを忘れています! T のパラメーターの 1 つがクラスではなく、定数の整数である場合はどうなるでしょうか。それをサポートしようとしましょう:
template<class T>
void myfunc();
template<template<class> T>
void myfunc();
template<template<class, class> T>
void myfunc();
template<template<class, class, class> T>
void myfunc();
// etc.
template<template<class> T>
void myfunc();
template<template<class, int> T>
void myfunc();
template<template<int, class> T>
void myfunc();
template<template<int, class, class> T>
void myfunc();
template<template<class, int, class> T>
void myfunc();
template<template<class, class, int> T>
void myfunc();
// etc.
ええとああ。任意の定数型を任意の数でテンプレートに渡すことができ、クラス パラメータと混合できるとすれば、KABLOOEY の組み合わせ爆発です。さらに難しいことに、T のパラメーターのいずれか自体がテンプレートである場合はどうなるでしょうか。