是否可以使用参数包而不是嵌套模板序列?

Gle*_*leb 2 c++ templates template-meta-programming

Hy,我正在制作一些元编程库,可以帮助从简单的ad-mixture类到继承构建复杂的对象.

例如,我得到了一些产生一组模板类的机制,每个模板类代表一个属性.

我来到了最终的构建过程,看起来像这样:

class Car : public Position< Size< Color< BaseObj<Car> > > > {/*...*/};
Run Code Online (Sandbox Code Playgroud)

我完全不喜欢它.
(BaseObj始终是序列中最内层的模板)

我尝试制作一些处理模板,以便能够像这样写:

class Car : public Proc< Position, Size, Color, Car > {/*...*/};
Run Code Online (Sandbox Code Playgroud)

但没有成功.

是否可以制作这样的模板?
是否有任何其他更易读的语义可以与一系列这样的嵌套模板具有相同的效果?

Vit*_*meo 5

所以你要...

nest<A, B, C, D>::type<E>
Run Code Online (Sandbox Code Playgroud)

...成为...

A<B<C<D<E>>>>
Run Code Online (Sandbox Code Playgroud)

这是递归的工作.


template <template <typename> typename...>
struct nest;

template <template <typename> typename First, 
          template <typename> typename... Rest>
struct nest<First, Rest...>
{
    template <typename Leaf>
    using type = First<typename nest<Rest...>::template type<Leaf>>;
};

template <template <typename> typename Last>
struct nest<Last>
{
    template <typename Leaf>
    using type = Last<Leaf>;
};
Run Code Online (Sandbox Code Playgroud)

用法示例:

template <typename> struct A { };
template <typename> struct B { };
template <typename> struct C { };
template <typename> struct D { };
struct E { };

int main()
{
    static_assert(std::is_same_v<
        typename nest<A, B, C, D>::template type<E>,
        A<B<C<D<E>>>>
    >);
}
Run Code Online (Sandbox Code Playgroud)

wandbox.org上的实例

  • @SirGuy一旦你处理了足够的模板,你就忘记了;) (2认同)