/ Częściowa specjalizacja szablonów / C ++ z klasami - c ++, szablony, specjalizacja szablonów

Szablony C ++ częściowa specjalizacja z klasami - c ++, szablony, specjalizacja szablonów

Próbuję częściowej specjalizacji C ++ z klasami. Pytanie dotyczy bardziej składni niż semantyki. Właściwie chcę mieć coś takiego:

int main()
{
...
Reduce<int, float> r(new int, new float);
Reduce<int> r2(new int); // partial template specialization?
...
}

Aby osiągnąć powyższe, próbowałem:

template <typename T, typename U>
class Reduce {
public:
Reduce(T *t, U *u) { }
};

template <typename T>
class Reduce<T,T> {
public:
Reduce(T *t) { }
};

W przypadku powyższego kodu nie mogę użyć następującej instrukcji:

Reduce<int> r2(new int); // error: wrong number of template arguments (1, should be 2)

Nadal muszę zrobić:

Reduce<int, int> r2(new int);

Czy ktoś może wyjaśnić: (1) Jak mogę osiągnąć pożądaną składnię (jeśli to możliwe) (2) jeśli nie jest to możliwe, dlaczego? (tj. problemy techniczne)

Odpowiedzi:

5 dla odpowiedzi № 1

Określ domyślny typ drugiego typu szablonu:

template <typename T, typename U = int>
class Reduce {
public:
Reduce(T *t, U *u) { }
};

lub domyślnie taki sam jak pierwszy typ szablonu:

template <typename T, typename U = T>
class Reduce {
public:
Reduce(T *t, U *u) { }
};

Widzieć http://ideone.com/5RcEG na przykład.


4 dla odpowiedzi nr 2

W zależności od tego, czego ostatecznie chcesz, może to być rozwiązanie, ale przynajmniej kompiluje:

template <typename... T>
class Reduce;

template <typename T, typename U>
class Reduce<T,U> {
public:
Reduce(T *t, U *u) { }
};

template <typename T>
class Reduce<T> {
public:
Reduce(T *t) { }
};

int main()
{
Reduce<int, float> r(new int, new float);
Reduce<int> r2(new int); // partial template specialization?
}

0 dla odpowiedzi № 3

Z deklaracji szablonu

template <typename T>
class Reduce<T,T> {
public:
Reduce(T *t) { }
};

widać, że musisz podać 2 argumenty szablonu w celu zmniejszenia. Zmień też swoje użycie

Reduce<int,int> r2(new int)