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

标签 c++ templates template-meta-programming

嘿,我正在制作一些元编程库,可以帮助通过继承从简单的混合类构造复杂的对象。

例如,我有一些机制可以生成一组模板类,每个模板类代表一个属性。

我得出了最终的构建过程,如下所示:

class Car : public Position< Size< Color< BaseObj<Car> > > > {/*...*/};

我非常不喜欢它。
(BaseObj 始终是序列中最内部的模板)

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

class Car : public Proc< Position, Size, Color, Car > {/*...*/};

但没有成功。

可以制作这样的模板吗?
是否还有其他更具可读性的语义可以与此类嵌套模板序列具有相同的效果?

最佳答案

所以,你想要...

nest<A, B, C, D>::type<E>

...成为...

A<B<C<D<E>>>>

这是递归的工作。


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

使用示例:

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>>>>
    >);
}

live example on wandbox.org

关于c++ - 是否可以使用参数包而不是嵌套模板序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47458428/

相关文章:

c++ - 通过数组绘制对象

c++ - 函数模板内的相同文本字符串

c++ - 元函数计算 x^n 并在不可能的情况下返回整数限制而不溢出?

c++ - 获取 mpl vector 的前 M 个元素

c++ - 仅当元组中存在该类型时才将函数应用于元组元素

c++ - 在构造函数中注册 weak_ptr 观察者

c++ - zlib inflate 方法没有按预期工作

c++ - Cuda原子操作

c++ - 创建一个 C++ 模板函数,它将返回特定大小的 std::array

c++ - 模板模板函数的重载 - 显式调用