Partial template specialization fuer template template paramter

09/10/2015 - 11:28 von Helmut Zeisel | Report spam
Ich habe eine template Klasse mit einem template Parameter P<typename,size_t>:

template<template<typename, size_t> class P, typename T, size_t n> struct consumer
{
typedef typename P<T, n>::type bool_type;
static void show()
{
std::cout << bool_type::value << std::endl;
}
};

Nun habe ich Klassen, die nur von einem Typ oder nur von einem size_t abhàngen, also z.B.


std::is_integral

bzw.

template<size_t n> struct gt0: std::integral_constant<bool, (n>0)> {};

Dann kann ich natürlich Adapter für das gewünschte Interface schreiben:


template<template<typename> class P> struct adapter_t
{
template<typename T, size_t> struct trait
{
typedef typename P<T>::type type;
};
};

template<template<size_t> class P> struct adapter_s
{
template<typename, size_t sz> struct trait
{
typedef typename P<sz>::type type;
};
};

Das klappt auch so weit:

consumer<adapter_s<gt0>::trait, int, 5 >::show();
consumer<adapter_t<std::is_integral>::trait, int, 5 >::show();


Ich wuerde nun aber nicht gerne zwei Namen fuer adapter_t und adapter_s nehmen, sondern haette gerne beide als Partial Template Specialization eines gemeinsamen Templates, also z.B.

template<template<typename, size_t> class P> struct adapter;

template<template<typename> class P> struct adapter<P>
{
template<typename T, size_t> struct trait
{
typedef typename P<T>::type type;
};
};

template<template<size_t> class P> struct adapter<P>
{
template<typename, size_t sz> struct trait
{
typedef typename P<sz>::type type;
};
};

Error: the template parameter list for class template 'P' does not match the template parameter list for template parameter 'P'

Ich habe da noch veschiedene andere Varianten versucht, allerdings ohne Erfolg.

Meine Frage: wie geht es richtig?

Helmut
 

Lesen sie die antworten

#1 Helmut Zeisel
09/10/2015 - 12:12 | Warnen spam
Am Freitag, 9. Oktober 2015 11:30:03 UTC+2 schrieb Helmut Zeisel:

Das klappt auch so weit:

consumer<adapter_s<gt0>::trait, int, 5 >::show();
consumer<adapter_t<std::is_integral>::trait, int, 5 >::show();




Zusatzfrage: folgende Funktion compiliert unter VC 2015 (und liefert das erwartete Ergebnis)


template<template<typename> class C> void f()
{
consumer<typename adapter_t<C>::trait, int, 5 >::show();
}

gcc 4.9.3 hingegen meint:

error: expected a class template, got 'typename adapter_t<C>::trait'

Was sagt der Standard dazu?

Helmut

Ähnliche fragen