Скажем, у меня был шаблон как template<typename T> class my_data_structure
, Я хотел бы, чтобы шаблон мог обрабатывать примитивные типы, например int
и объекты, а также указатель переменной (например, Vertex*
).
Операции могут быть:
>
, object->compare(another_object)
для переменных указателя.Можно ли это сделать без необходимости писать две разные структуры данных? Извините, я не могу разместить больше кода, но это часть школьного проекта, и я бы не стал обвиняться в плагиате.
Использовать частичная специализация шаблона:
Основной шаблон:
template<typename T>
struct Foo
{
bool operator ==( T otherData )
{
return m_data == otherData;
}
T m_data;
};
Частичная специализация шаблона для T*
template<class T>
struct Foo<T*>
{
bool operator ==( const T &otherObj )
{
return m_obj->compare( otherObj );
}
T* m_obj;
};
Вам нужно сделать частичную специализацию для обработки между указателями и не указателями типов. Для обработки всех интегральных типов вы можете использовать std::enable_if
вместе std::is_arithmetic
,
//non pointer type definition
template<typename T> class my_data_structure
{
bool operator(std::enable_if<not std::is_arithmetic<T>::value> other)
{
// do your bidding here for non arithmetic objects
}
bool operator(std::enable_if<std::is_arithmetic<T>::value> other)
{
// do your bidding here for ints/floats etc
}
};
//pointer type specilization ( call object->compare(another_object) as needed
template<typename T> class my_data_structure<T*>
{
//... put the actual comparator here
};