请注意:这个问题看起来比实际情况要更加显而易见。
我想写一个模板,它可以接受任何具体类或模板类作为模板参数。这可能看起来毫无意义,因为不知道传入的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库可以为我们生成此代码(在C++0x中将添加对可变参数模板的支持,因此这种丑陋只是暂时的)。但是我们仍然忘记了一种情况!如果T的某个参数不是类而是常量整数,该怎么办呢?让我们尝试支持它:
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的任何参数本身是模板呢?