C ++模板专业化。你如何选择特定的类型?

时间:2017-09-24 17:00:08

标签: c++ generics

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版本,但我不想为每种可能的类型编写专门化。

1 个答案:

答案 0 :(得分:0)

尝试从课堂外跟随:

template <>
void DataClass<int>::WriteData2(Serialization::Object* obj, int* data) {
    uint64 lData = *data;  
    obj->Write(lData);
}