Тот же класс с 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;
                }
        }
};
Другие вопросы по тегам