/ / Ako môžem skontrolovať, či je typ inštancie danej šablóny triedy? [duplicate] - c ++, šablóny, meta-programovanie šablón

Ako môžete skontrolovať, ak je typ generovaní inštancie šablóny danej triedy?[kopírovať] - c , šablóny, šablóny-meta-programovanie

Je možné skontrolovať, či je typ inštancie konkrétnej šablóny?

Mám šablónu triedy, kde jeden z parametrov šablóny musí byť buď inštancia konkrétnej šablóny, alebo nejaký iný typ. Zoberme si napríklad túto jednoduchú definíciu typelistu:

struct null_type;

template <typename Head, typename Tail>
struct typelist
{
// Tail must be a typelist or null_type

typedef Head head;
typedef Tail tail;
};

Teraz by som sa chcel uistiť, že typ poskytnutý pre Tail parameter šablóny je vždy buď konkretizácia typelist alebo null_type, Na definovanie šablóny len pre tieto prípady by som mohol použiť čiastočnú špecializáciu:

template <typename Head, typename Tail>
struct typelist; // default, not defined

template <typename Head, typename H, typename T>
struct typelist< Head, typelist<H,T> > // Tail = typelist, ok
{
typedef Head head;
typedef typelist<H,T> tail;
};

template <typename Head>
struct typelist< Head, null_type > // Tail = null_type, ok
{
typedef Head head;
typedef null_type tail;
};

Skončím však duplikáciou kódu, čo by som sa chcel vyhnúť. V ideálnom prípade potrebujem vlastnosť na otestovanie, či typ je inštancia šablóny, na jej použitie s enable_if alebo v statických tvrdeniach:

#include <boost/mpl/or.hpp>
#include <type_traits>

struct null_type;

template <typename Head, typename Tail>
struct typelist
{
static_assert(
boost::mpl::or_<
is_instantiation_of< typelist, Tail >,
std::is_same< Tail, null_type >
>::value,
"Tail must be a typelist or null_type" );

typedef Head head;
typedef Tail tail;
};

Je táto vlastnosť (is_instantiation_of) už dostupné v štandardnej knižnici alebo v Booste? Je možné ho napísať?

odpovede:

17 pre odpoveď č. 1

Prišiel som s nasledujúcim riešením, pomocou C ++ 11 variadic šablón a jednoduchej čiastočnej špecializácie:

#include <type_traits>

template < template <typename...> class Template, typename T >
struct is_instantiation_of : std::false_type {};

template < template <typename...> class Template, typename... Args >
struct is_instantiation_of< Template, Template<Args...> > : std::true_type {};

To by mohlo byť prispôsobené na C ++ 03 pomocou preprocesora na generovanie verzií pre rôzny počet parametrov šablóny, ale možno je to jednoduchší spôsob.