Создать класс массива с методом поиска для констант простых типов (int) и указателей

Теперь у меня есть

template<class C> class Array
{
inline int Search(const C &value) const;
...
}

я хочу использовать таким образом

Array<int *> a;
int i;
const int *pi = &i;
a.Search(pi);

но я получил

ошибка C2664: «A :: Search»: невозможно преобразовать параметр 1 из «const»
int * ‘to’ int * const &’

возможно ли это как-то обойти?

Только я могу думать пока, что это частично специализировать этот клакс для указателей, но я не уверен.

template<class C> class Array<C*>
{
inline int Search(const C *&value) const;
...
}

Это хороший способ, может быть, это можно сделать без частичной специализации?

2

Решение

Как вы заметили, ваша проблема связана с тем, что вы добавляете верхний уровень const к вашему параметру шаблона, но когда дело доходит до указателей, это дает T * const не T const *,

Специализация вашего шаблона — это один из способов добиться того, чего вы хотите.

Другой способ — создать вспомогательный шаблон, который позаботится о глубокой «консистенции», и использовать его в своем основном шаблоне. Обычно это проще сделать, потому что это означает меньшее дублирование кода. Что-то вроде:

template<typename C>
struct Constify {
typedef const C type;
};

template<typename C>
struct Constify<C*> {
typedef const C* const type;
};

template<class C>
class Array
{
inline int Search(typename Constify<C>::type & value) const;
...
};
1

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

Других решений пока нет …

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