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ď č. 1Priš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.