Объединение классов политики — Параметры шаблона шаблона & amp; Вариадические шаблоны

Мне интересно, возможно ли объединить классы политик, используя переменные параметры шаблона-шаблона, чтобы каждая политика могла иметь свой собственный пакет шаблонов. Кажется, что вы можете использовать только один пакет шаблонов среди всех политик, но я надеюсь, что это не так.

Кажется, что возможно следующее:

template <
class T,
template <class, typename...>   class Policy1,
template <class, typename...>   class Policy2,
template <class, typename...>   class Policy3,
typename... Args
>
struct PolicyClass
: public Policy1     <ObjT, Args...>
, public Policy2     <ObjT, Args...>
, public Policy3     <ObjT, Args...>    {}

Я надеюсь, что каждая политика может иметь свой собственный пакет, чтобы я мог сделать что-то вроде этого (?):

template <class T>
struct implementedPolicy1 {};
template <class T>
struct implementedPolicy2 {};
template <class T, class A>
struct implementedPolicy3 {};

PolicyClass <ObjT,
implementedPolicy1,
implementedPolicy2,
implementedPolicy3<AType>
>

Идея состоит в том, что каждая из политик использует один и тот же тип объекта, но у третьей есть дополнительные шаблоны. Я знаю, что выше приведен неправильный код — просто пытаюсь проиллюстрировать, что я хотел бы сделать.

Спасибо

4

Решение

Вы должны иметь возможность разграничивать пакеты.

// helper template.  Using `std::tuple<>` instead is another option.
template<class...>struct type_list {};

// base, note no body:
template <
class T,
template <class, typename...>   class Policy0,
template <class, typename...>   class Policy1,
template <class, typename...>   class Policy2,
typename... Packs
>
struct PolicyClass;

// specialization:
template <
class T,
template <class, typename...>   class Policy0,
template <class, typename...>   class Policy1,
template <class, typename...>   class Policy2,
typename... A0s,
typename... A1s,
typename... A2s
>
struct PolicyClass<
T, Policy1, Policy2, Policy3,
type_list<A0s...>, type_list<A1s...>, type_list<A2s...>
>
: Policy0<T, A0s...>, Policy1<T, A1s...>, Policy2<T, A2s...> {}

где я упаковываю каждую политику дополнительные аргументы в type_list,

Теоретически вы могли бы делать более причудливые вещи, например, иметь определенные типы «тегов» в качестве разделителей, но в итоге получается много гимнастики.

PolicyClass< int, bob, eve, alice, type_list<>, type_list<double>, type_list<char, char, char> > foo;

создаст

PolicyClass: bob<int>, alice<int, double>, eve<int, char, char, char>

примерно.

1

Другие решения

Я никогда не был поклонником параметров шаблона шаблона, и это еще один пример, который я бы избегал:

template <typename T, typename... Policies>
struct PolicyClass: Policies... {};

будет просто работать с произвольной политикой:

using PC = PolicyClass<int,
LifetimePolicy<LP::Extended>,
DurabilityPolicy<3600, DP::Seconds>
StoragePolicy<int, SP::InMemory>>;
3

Обратите внимание, что у вас может быть что-то вроде:

template <class T,
template <class> class Policy1,
template <class> class Policy2,
template <class> class Policy3>
struct PolicyClass : public Policy1<ObjT>,
public Policy2<ObjT>,
public Policy3<ObjT>
{};

template <class T> struct implementedPolicy1 {};
template <class T> struct implementedPolicy2 {};
template <class T, class A> struct implementedPolicy3 {};

// Adapt the policy interface
template <class T>
using myImplementedPolicy3 = implementedPolicy3<T, AType>; // Assuming AType exist

PolicyClass <ObjT, implementedPolicy1, implementedPolicy2, myImplementedPolicy3> policies;
1
По вопросам рекламы [email protected]