【发布时间】:2019-06-20 21:18:01
【问题描述】:
我会感谢任何模板专家在这方面提供一些帮助。我将 CRTP 用于 mixin 类,并希望能够将参数传递给派生类的函数,并让它调用所有 mixin 的继承函数并转发适当数量的参数。例如:
template<Host> struct Mixin1 { void Initialize(int, double); };
template<Host> struct Mixin2 { void Initialize(); };
template<Host> struct Mixin3 { void Initialize(double); };
template <template<class> class... Components>
struct Entity : public Components<Entity<Components...>>...
{
template<template<class> class ...Types, template<template<typename>typename...> class T, class... Args>
void Initialize(const T<Types...>&, Args&&... args) {
(Types<Entity<Types>>::Initialize(forward<Types>(args)),...);
}
}
并像这样使用:
entity.Initialize(42,42.0,42.0);
是否可以向每个参数传递适当数量的参数?上面的代码当然不起作用,但我的想法是尝试使用每个参数的类型(即Variad<int, double> v1; Variad<> v2; Variad<double> v3;)实例化一个空模板的方法,并将包含所有这些参数的变量与参数一起传递给函数但我似乎无法弄清楚如何正确拆分参数。
【问题讨论】:
-
只是为了确定...给定
Entity<Mixin1, Mixin2, Mixin3> entity;,从entity.Initialize(1, 2.0, 3.0);调用你想要从Mixin1调用Initialize(1, 2.0),从Mixin2和Initialize()调用Initialize()来自Mixin3? -
应该可以想出一些混乱的 TMP 解决方案来解决这个问题,但是一旦有人使 mixin 类的
Initialize方法之一重载或模板,它就会中断。相反,您应该让Entity::Initialize获取参数的元组 列表,将每个元组中的参数转发到相应的mixin 的Initialize方法。 -
是的@max66,这是预期的行为。
-
@Brian 一个凌乱的 TMP 解决方案实际上对我来说没问题,可以安全地假设该函数将被模板化或重载。主要需要使用完美转发、不复制的功能。如果我没记错的话,使用元组至少需要复制一次吗?
-
顺便说一句,我认为 TMP 解决方案无论如何都会创建元组(对于元组,您可能有
tuple<T&, U&&>以避免额外的复制)。
标签: c++ variadic-templates multiple-inheritance variadic-functions fold