我在寫一個模板,我試圖提供一個模板類的類專業化。當使用它實際上我與模板類的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