组合策略类-模板模板参数和可变参数模板

scmcduffee

我想知道是否有可能使用可变参数模板模板参数组合策略类,以便每个策略都可以拥有自己的模板包。似乎您只能在所有策略中共享一个模板包,但我希望不是这样。

以下似乎是可能的:

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>
            >

每个策略的想法都使用相同的对象类型,但是第三个策略有一些进一步的模板。我知道上面的代码不正确-只是试图说明我想做的事。

谢谢

Yakk-亚当·内夫罗蒙特

您需要能够在两个包之间定界。

// 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>

大致。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章