【发布时间】:2014-06-01 09:10:38
【问题描述】:
我正在尝试使用 C++ Mixins,但是,我是由工厂创建的,这些工厂遵循与创建的项目相同的层次结构。
我在以正确的顺序扩展工厂创建函数和构造函数时遇到了问题。
例如:
template<class BaseT>
class MixInA : public BaseT
{
public:
template <class... Args>
void MixInA(double a, Args&&... args) { m_a(a), Base(std::forward<Args>(args)...); }
double m_a;
}
template<class FactoryBaseT>
class FactoryMixInA : public FactoryBaseT
{
public:
template <class... Args>
void GetNewItem(Args&&... args) { FactoryBaseT::GetNewItem(m_a, std::forward<Args>(args)...); }
double m_a;
}
template<class BaseT>
class MixInB : public BaseT
{
public:
template <class... Args>
void MixInB(double a, Args&&... args) { m_b(b), Base(std::forward<Args>(args)...); }
double m_b;
}
template<class FactoryBaseT>
class FactoryMixInB : public FactoryBaseT
{
public:
template <class... Args>
void GetNewItem(Args&&... args) { FactoryBaseT::GetNewItem(m_b, std::forward<Args>(args)...); }
double m_b;
}
这适用于单个 mixin,但不幸的是无法扩展。
例如,如果我们有一个工厂
typedef FactoryMixInB<FactoryMixInA<BaseFactory> > FinalFactory
typedef MixInB<MixInA<Base> > FinalItem
然后FinalFactory::GetNewItem(Args&&... args) 扩展为GetNewItem(m_a, m_b, ...)
但构造函数扩展为FinalItem::FinalItem(m_b, m_a, ...)
问题是构造函数被构建了Base -> MixInA -> MixInB
工厂去了FactoryMixInB -> FactoryMixInA -> BaseFactory
这个问题的解决方法是什么?
我正在考虑通过写作改变工厂的方向
template<class FactoryBaseT>
class FactoryMixInB : public FactoryBaseT
{
public:
template <class... Args,class... Args2>
void GetNewItem(Args&&... args)
{
Args2&&... base_args = FactoryBaseT::GetAdditionalConstructorArgs();
Args&&... new_args = GetAdditionalConstructorArgs();
GetNewItem(std::forward<Args>(new_args)..., std::forward<Args2>(base_args)...);
}
template <class... Args>
Args&&... GetAdditionalConstructorArgs() { return m_b; }
double m_b;
}
但这不起作用,因为它需要返回一个参数包,我认为这是不可能的。
还有其他答案吗?可以将包装包裹到例如一个元组?有这方面的设计模式吗?
【问题讨论】:
-
使用元组和索引技巧返回一个可变参数包并再次将其作为一个包传递