我在写一个模板,我试图提供一个模板类的类专业化。当使用它实际上我与模板类的derivitives instanciating,所以我有这样的事情:通过模板基类专门设计模板
template<typename T> struct Arg
{
static inline const size_t Size(const T* arg) { return sizeof(T); }
static inline const T* Ptr (const T* arg) { return arg; }
};
template<typename T> struct Arg<Wrap<T> >
{
static inline const size_t Size(const Wrap<T>* arg) { return sizeof(T); }
static inline const T* Ptr (const Wrap<T>* arg) { return arg.Raw(); }
};
class IntArg: public Wrap<int>
{
//some code
}
class FloatArg: public Wrap<float>
{
//some code
}
template<typename T>
void UseArg(T argument)
{
SetValues(Arg<T>::Size(argument), Arg<T>::Ptr(&argument));
}
UseArg(5);
UseArg(IntArg());
UseArg(FloatArg());
在所有情况下的第一个版本被调用。所以基本上我的问题是:我在哪里出错了,我怎么让他调用在调用UseArg(5)时返回arg的版本,而在调用UseArg(intArg)时调用另一个呢?其他方式做这样的事情(不改变UseArg的接口)当然欢迎。
作为一个注释,这个例子有点简单,这意味着在实际的代码中我包装了一些更复杂的东西,派生类有一些实际的操作。
这可能会解决问题,但不是模板专业化。 – 2010-01-03 23:47:46
它也不解决我的问题,因为我真的需要派生类 – Grizzly 2010-01-03 23:57:47
哈桑,那么什么是部分专业化? :) – 2010-01-04 00:06:48