Partial Template specialization fuer Constructor

22/11/2014 - 08:30 von Helmut Zeisel | Report spam
Ich habe eine Template struct S, die einen Container C (z.B. std::vector) verwendet:

template<typename T, typename C>
struct S
{
public:
S(T t): t_(t), c_(t.size()) {}

private:
T t_;
C c_;
};

In Spezialfàllen möchte ich aber statt std::vector ein std::array nehmen. Da funnktioniert c_(t.size()) nicht. Die Spezialisierung der strucht S klappt:

template<typename T, typename V, std::size_t N>
struct S<T, std::array<V,N>>
{
public:
S(T t): t_(t) {}
private:
T t_;
std::array<V,N> c_;
};

Ich möchte aber nicht die ganze Struct spezialiseren (und damit Code verdoppeln), sondern nur den Constructor.

template<>
template<typename T, typename V, std::size_t N>
S<T, std::array<V,N>>::S<T, std::array<V,N>>(T t): t_(t) {}

liefert aber

"S<T, std::array<_Tp, _Nm> >' has no template constructors" (gcc)

Wie geht es richtig?

Helmut
 

Lesen sie die antworten

#1 Stefan Reuther
22/11/2014 - 09:48 | Warnen spam
Helmut Zeisel wrote:
template<typename T, typename V, std::size_t N>
struct S<T, std::array<V,N>>
{
public:
S(T t): t_(t) {}
private:
T t_;
std::array<V,N> c_;


^^^^^^^^^^^^^^^
Sollte das nicht 'size_t c_' o.à. sein?

};

Ich möchte aber nicht die ganze Struct spezialiseren
(und damit Code verdoppeln), sondern nur den Constructor.



Die Fallunterscheidung in ein zweites Template auslagern:
template<typename V>
size_t size(const V& v) {
return v.size();
}
template<typename V, size_t N>
size_t size(const std::array<V,N>&) {
return N;
}
und das aus dem Konstruktor verwenden:
S(T t): t_(t), c_(size(t)) {}

Ich kenne mich mit der C++11-Bibliothek jetzt noch nicht so aus, würde
aber erwarten, dass es sowas sogar schon fertig gibt, analog zu
std::begin() / std::end().


Stefan

Ähnliche fragen