Создание шаблонов в C ++ для обработки указателей на объекты и примитивные типы

Скажем, у меня был шаблон как template<typename T> class my_data_structure, Я хотел бы, чтобы шаблон мог обрабатывать примитивные типы, например int и объекты, а также указатель переменной (например, Vertex*).

Операции могут быть:

  1. Прямое сравнение целых чисел или объектов, например с помощью >,
  2. object->compare(another_object) для переменных указателя.

Можно ли это сделать без необходимости писать две разные структуры данных? Извините, я не могу разместить больше кода, но это часть школьного проекта, и я бы не стал обвиняться в плагиате.

1

Решение

Использовать частичная специализация шаблона:

Основной шаблон:

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;
};
0

Другие решения

Вам нужно сделать частичную специализацию для обработки между указателями и не указателями типов. Для обработки всех интегральных типов вы можете использовать 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
};
0

По вопросам рекламы [email protected]