模板类型的模板方法特化
Template method specialization for template type
有像这样的模板 类(为理解我的观点而进行了简化):
template <typename TYPE> class Wrapper
{
TYPE m_tValue;
void DoSomething();
};
template <typename TYPE> class Array
{
TYPE * m_pArray;
};
是否可以(以及如何?)专门化方法 Wrapper<Array<TYPE>>::DoSomething()
?
我的意思是,我可以通过定义 int
类型专门化此方法:
template <> void Wrapper<int>::DoSomething(){...};
但是我如何为 Array
专门化它但保持 Array
不专门化?
当然,我可以写:
template <> void Wrapper<Array<int>>::DoSomething(){...};
但这根本不是通用的,并且与模板的优势相矛盾。
我试过
template <typename T> void Wrapper<Array<T>>::DoSomething(){...};
但是我有编译错误。
我想知道正确的做法是什么?谢谢
不,C++ 不支持函数模板的偏特化,而您想要的是函数模板的有效偏特化。但是,在这些情况下,您通常可以使用 "delegate to class" 技巧。
像这样更改 DoSomething
的原始实现:
template <typename TYPE> class Wrapper
{
TYPE m_tValue;
void DoSomething() { DoSomethingHelper<TYPE>::call(*this); }
};
template <class TYPE>
struct DoSomethingHelper
{
static void call(Wrapper<TYPE> &self) {
/*original implementation of DoSomething goes here*/
}
};
有了这个,你可以部分特化 DoSomethingHelper
:
template <class TYPE>
struct DoSomethingHelper<Array<TYPE>>
{
static void call(Wrapper<Array<TYPE>> &self) {
/*specialised implementation of DoSomething goes here*/
}
};
有像这样的模板 类(为理解我的观点而进行了简化):
template <typename TYPE> class Wrapper
{
TYPE m_tValue;
void DoSomething();
};
template <typename TYPE> class Array
{
TYPE * m_pArray;
};
是否可以(以及如何?)专门化方法 Wrapper<Array<TYPE>>::DoSomething()
?
我的意思是,我可以通过定义 int
类型专门化此方法:
template <> void Wrapper<int>::DoSomething(){...};
但是我如何为 Array
专门化它但保持 Array
不专门化?
当然,我可以写:
template <> void Wrapper<Array<int>>::DoSomething(){...};
但这根本不是通用的,并且与模板的优势相矛盾。
我试过
template <typename T> void Wrapper<Array<T>>::DoSomething(){...};
但是我有编译错误。
我想知道正确的做法是什么?谢谢
不,C++ 不支持函数模板的偏特化,而您想要的是函数模板的有效偏特化。但是,在这些情况下,您通常可以使用 "delegate to class" 技巧。
像这样更改 DoSomething
的原始实现:
template <typename TYPE> class Wrapper
{
TYPE m_tValue;
void DoSomething() { DoSomethingHelper<TYPE>::call(*this); }
};
template <class TYPE>
struct DoSomethingHelper
{
static void call(Wrapper<TYPE> &self) {
/*original implementation of DoSomething goes here*/
}
};
有了这个,你可以部分特化 DoSomethingHelper
:
template <class TYPE>
struct DoSomethingHelper<Array<TYPE>>
{
static void call(Wrapper<Array<TYPE>> &self) {
/*specialised implementation of DoSomething goes here*/
}
};