我正在编写一个模板,我试图为其提供一个专门化的类,该类本身就是一个模板类。使用它时,我实际上是用模板类的派生类来实例化它,所以我有这样的东西:
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 的界面)。
作为一个注释,这个例子有点简单化,这意味着在实际代码中我包装了一些更复杂的东西,派生类有一些实际操作。