嘿,我正在制作一些元编程库,可以帮助通过继承从简单的混合类构造复杂的对象。
例如,我有一些机制可以生成一组模板类,每个模板类代表一个属性。
我得出了最终的构建过程,如下所示:
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>>>>
>);
}
关于c++ - 是否可以使用参数包而不是嵌套模板序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47458428/