Не шаблонные члены шаблона класса сами являются независимыми шаблонами. Вы можете специализировать их самостоятельно. В вашем случае - с помощью явной специализации
// Main template
template<class STREAM_TYPE>
class MyClass
{
void initialize()
{
}
};
// Specialization, declared outside the main template definition
template<>
void MyClass<std::ifstream>::initialize()
{
for(MyStruct& ms : _myStructs)
{
ms._ifs = new std::ifstream("");
}
}
Вам решать, какая версия метода является версией по умолчанию, а какая - специализированной. Или, может быть, вы хотите объявить обе версии как специализации.
Например, вы можете решить рассматривать обе версии как специализации, при этом определяя основную версию как удаленную
// Main template
template<class STREAM_TYPE>
class MyClass
{
void initialize() = delete;
};
// Specialization, declared outside the main template definition
template<>
void MyClass<std::ifstream>::initialize()
{
for(MyStruct& ms : _myStructs)
{
ms._ifs = new std::ifstream("");
}
}
template<>
void MyClass<std::stringstream>::initialize()
{
}
Только помните, что явная специализация больше не является шаблоном. Он подчиняется ODR как обычная функция. Даже если ваш шаблонный класс определен в заголовочном файле (как это обычно бывает с шаблонными классами), определение вышеуказанных специализаций должно идти в файл .cpp
. Заголовочный файл должен содержать простые объявления для вашей специализации
// header file declarations
template<> void MyClass<std::ifstream>::initialize();
template<> void MyClass<std::stringstream>::initialize();
в то время как определения должны идти в файл .cpp
.