Тот же класс с 2 или 1 параметром шаблона
Как сделать шаблонную специализацию, которая принимает 2 параметра по сравнению с обычным 1? Я строил класс указателя и теперь думал о расширении для создания массива, но если я попробую что-то вроде этого:
template<class T,int s> class pointer{};
template<class T> class pointer{};
class mama{};
int main(){
pointer<mama> m;
}
Это дает мне ошибку. Шаблон... объявлен заново с 1 параметром.
Мне нужно это специализированное, потому что pointer<mama,10>
имеет размер () и оператор [] в то время как pointer<mama>
нет, у него есть операторы -> и *.
3 ответа
Вы можете сделать общий шаблон для массива:
template <class TElem, int size = 0>
class pointer
{
// stuff to represent an array pointer
};
Тогда частичная специализация:
template <class TElem>
class pointer<TElem, 0>
{
// completely different stuff for a non-array pointer
};
Определив специализированную версию для случая, когда size=0, вы можете фактически дать ей совершенно другую реализацию, но с тем же именем.
Однако, может быть, будет понятнее просто дать ему другое имя.
В вашем коде есть переопределение шаблона класса, что приведет к ошибке во время компиляции. Вы можете иметь параметры шаблона по умолчанию и параметры шаблона шаблона.
template<class T,int s=10> class pointer{};
class mama{};
int main(){
pointer<mama> m;
}
Мне нужно, чтобы он специализировался, потому что у указателя есть size() и operator[], а у указателя нет, у него есть operator-> и *.
Похоже, вам нужен другой дизайн для вашего класса. Я не уверен, что специализация шаблона - это путь. Судя по вашей проблеме, вы действительно должны думать о специализации на основе черт.
Вы можете иметь значение по умолчанию для второго параметра, возможно, что-то вроде этого:
template <class T, int N=0>
class moo {
T *foo;
public:
moo() {
if (N > 0) {
foo = new T[N];
}
else
{
foo = new T;
}
}
};