template <class MyType>
class DataClass
{
public:
virtual void WriteData(Serialization::Object* obj) override
{
obj->Write(m_myData);
}
private:
MyType* m_myData;
};
Serlialization :: Object知道如何编写特定类型:uint64,double,string。它的通用<T>
实现未使用static_assert实现。
问题是当MyType为int
时,它会选择通用实现。我希望它选择uint64
版本。我尝试在DataClass上添加一个特化,但它仍然更喜欢通用实现。 <class T>
virtual void WriteData(Serialization::Object* obj) override
{
WriteData2(obj, m_myData);
}
template <int>
void WriteData2(Serialization::Object* obj, int* data)
{
uint64 lData = *data;
obj->Write(lData);
}
template <class T>
void WriteData2(Serialization::Object* obj, T* data)
{
obj->Write(*data);
}
请注意,我尝试过各种指针/非指针调用组合,所以我认为不是问题所在。我尝试将template <>
留空,就像你在其他专业中那样,这会导致以下错误。
错误C2912:显式特化'无效 DataClass :: WriteData2(Serialization :: Object *,int)'不是 功能模板的专业化
所以,我的问题是如何让它在Serialization :: Object上选择正确的uint64
函数?我可以在Serialization :: Object上实现一个int版本,但我不想为每种可能的类型编写专门化。
答案 0 :(得分:0)
尝试从课堂外跟随:
template <>
void DataClass<int>::WriteData2(Serialization::Object* obj, int* data) {
uint64 lData = *data;
obj->Write(lData);
}