Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Она, мне лично, больше нравится, так как позволяет писать
typedef TypeList<int,char,bool,string, EmptyList> MyTypeList;
template<
typename T0 = internal::Void,
// ...
>
struct make_typelist
{
typedef List<T0, List<T1, List<T2, List<T3, List<T4, List<T5, List<T6, List<T7, List<T8, List<T9> > > > > > > > > > type;
};
typedef make_typelist<int, short, double, char>::type ...
EmptyList-а.template<typename T>
void foo(int x, typename std::enable_if</*Проверить, есть ли тип T в каком-то списке типов*/>::type* = NULL)
{
}
template<typename T, typename = typename std::enable_if</**/>::type>
struct Foo
{
};
Внесу и свой костыль:
template <typename... Types> using NiceTypeList = TypeList<Types..., EmptyList>;
typedef NiceTypeList<int, double, bool, char, const char*> MyTypeList;
А если задача состоит только в ограничении типов, которыми можно инстанциировать шаблон, то, как по мне, проще что-то такого:
// file: proto.h
template<typename ... Types> struct TypeList {};
using InstTypes = TypeList<int, float, double>;
template<typename T> T foo();
// file: proto.cpp
template<typename T> T foo()
{
return T(1);
}
template<typename T> struct Instantiator;
template<> struct Instantiator<TypeList<>> {};
template<typename T, typename ... Types> struct Instantiator<TypeList<T, Types...>>
{
T (* const f)() = &foo<T>;
Instantiator<TypeList<Types...>> rest;
};
static Instantiator<InstTypes> i;
// main.cpp
#include <iostream>
#include "proto.h"
int main()
{
std::cout << foo<int>() << foo<float>() << foo<double>() << std::endl;
return 0;
}
template<typename ... TArgs>
struct holder;
template<typename ... TArgs>
struct vpack
{
typedef void(functtion_type)(TArgs...);
typedef holder<TArgs...> holder_type;
};
template<typename T>
struct funpack;
template<typename ... TArgs>
struct funpack<void(TArgs...)>
{
}
template<typename T>
struct hunpack;
template<typename ... TArgs>
struct hunpack<holder<TArgs...>>
{
}
так как позволяет писать
typedef TypeList<int,char,bool,string, EmptyList> MyTypeList;
вместо классической записи
typedef TypeList<int,TypeList<char,TypeList<bool,TypeList<string, EmptyList>>>> MyTypeList;
typedef MakeTypelist<int,char,bool,string>::Result MyTypeList;typedef LOKI_TYPELIST_4(int,char,bool,string) MyTypeList;
Инстанциирование шаблонов функций по списку типов (Часть 1)