【发布时间】:2009-06-02 15:27:01
【问题描述】:
预先警告:这个问题似乎比实际要明显得多。
我想编写一个可以接受任何具体类或模板类作为模板参数的模板。这可能看起来没用,因为如果不知道传入的 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 的一个参数不是一个类,而是一个常量整数怎么办。让我们尝试支持它:
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 的任何参数本身就是模板怎么办?
【问题讨论】:
-
我会回到绘图板并明确定义需求。你想达到什么目标?混合模板和类是否有意义(注意 std::vector
是一个类,而不是模板)。你真正想解决什么问题?
标签: c++ templates overloading