Хочу написать шаблонный класс, который будет получать в качестве параметра шаблона другой шаблонный класс.
Проблема в том, что среди шаблонов, которые будут параметрами, есть различные классы, которые имеют несколько отличающийся интерфейс и поэтому при компиляции возможны ошибки из-за несоответствия интерфейсов.
Как, например, ниже:
#include
template
T* GetNewObject()
{
T* pT = new T();
return pT;
}
};
template
std::shared_ptr
template
CreatorUser(TCreator& data)
{
m_pData = &data;
}
typename TCreator::object_type* GetNewObjectPtr()
{
return m_pData->GetNewObject();
}
std::shared_ptr
void SimpleFunction()
{
//Здесь на самом деле нужен вызов только одной фукнции:
//GetNewObjectPtr, если параметр шаблона FirstCreator
//GetNewObjectSharedPtr, если параметр шаблона SecondCreator
//но как дать понять компилятору это?
typename TCreator::object_type* pObj = GetNewObjectPtr();
delete pObj;
std::shared_ptr
typedef FirstCreator
int main()
{
IntCreatorFirst creator1;
IntCreatorSecond creator2;
CreatorUser
pCreatorUser1->SimpleFunction();
pCreatorUser2->SimpleFunction();
return 0;
}
При попытке вызвать SimpleFunction компилятор выдает ошибку
Error 1 error C2039: 'GetNewObjectEx' : is not a member of
'FirstCreator'
Что совершенно справедливо, так как такой функции у FirstCreator действительно нет.
Мне нужно написать SimpleFunction таким образом, чтобы если параметром CreatorUser является FirstCreator, то вызывался метод GetNewObjectPtr, а метод GetNewObjectSharedPtr вообще не создавался и наоборот.
Есть ли в C++ возможность сделать подобное?
UPD:
Исправил в соответствии с первым ответом, заработало. Пришлось правда завернуть функции в другую функцию - но тут, наверное, проблема старого компилятора (компилятор студии MS VS 2010), который все время ругался, что функция не может иметь шаблонных параметров по умолчанию:
void SimpleFunctionEx()
{
SimpleFunction
template
template
Ответ
Можно попробовать использовать SFINAE
template
template
Комментариев нет:
Отправить комментарий