csrss Ответов: 0

Проверьте, является ли тип шаблона указателем


Привет. Я пытаюсь проверить тип шаблона, если это указатель, в основном моя цель состоит в том, чтобы создать класс контейнера, который будет знать, как сравнивать объекты независимо от того, является ли объект указателем или нет. Я хочу, чтобы класс динамически выбирал метод сравнения. Мой текущий код находится ниже, но он не работает, и я не знаю, в чем проблема. Он всегда выбирает
compare_ptr
как метод сравнения. Ниже кода

std::vector<int> vec;
vec.push_back(1);
int test = 0;
for (const int& val : vec)
{
    bool b = compare(val, test);
}

дает эту ошибку:
main.cpp:111: error: invalid type argument of unary ‘*’ (have ‘int’)
     return *obj1 == *obj2;

Я был бы очень признателен вам за помощь. Спасибо.

Что я уже пробовал:

template<typename Type>
struct is_shared_ptr { static const bool value = false; };

template<typename Type>
struct is_shared_ptr<std::shared_ptr<Type>> { static const bool value = true; };

template <class T>
static bool compare_ptr(const T& obj1, const T& obj2)
{
    return *obj1 == *obj2;
}

template <class T>
static bool compare_obj(const T& obj1, const T& obj2)
{
    return obj1 == obj2;
}

template <class T>
static bool compare(const T& obj1, const T& obj2)
{
    if (is_shared_ptr<T>::value)
    {
        return compare_ptr(obj1, obj2);
    }
    else
    {
        return compare_obj(obj1, obj2);
    }
}

0 Ответов