如何在模板类中添加常用功能?

时间:2019-05-03 11:20:43

标签: c++ templates

我有两个模板类,伪代码:

template<class L, class M>
class A
{
  L l; // copyable
  M m; // only moveable
}

template<class L, class M>
class B
{
  L l;
  M& m_ref;

  B(A& a, ExtraParameter ep)
    : l(a.l.subset(ep))
    , m(a.m) {}

  // +copy and move constructors and operators
}

(这里的想法是使用B作为对A的部分的引用。所以l可能有所不同,但是b.m_ref引用了a.m

取决于LM,我想添加一些同时添加到两个函数中的成员函数。此功能需要访问LM(如何)?

编辑:强调LM的依赖项。 LM将有不同的组合,并且其中一些允许额外的成员函数和/或专门使用LM的功能。

我试图将它们添加到B中,并使A成为B的子代。但是我无法为A提出一个移动操作符来更新m_ref edit:我通过将this强制转换为B来找到移动操作符。我仍然不喜欢这样,但是我解决了这个问题,因为问题已经解决了。

我考虑过将新的成员函数添加到第三类模板C中,并使A的两个子集(BC成为子元素。但是我无法想到一种提供对M的引用的方法。 CRTP似乎不合适,因为只有LMC的模板参数。

1 个答案:

答案 0 :(得分:2)

听起来好像您误解了CRTP可以做什么。模板库可以将LM作为参数

// base template
template <class AorB, class L, class M>
class C
{
};

// partial specialisation for some pair of L, M
template <class AorB>
class C<AorB, int, std::string>
{
};

template<class L, class M>
class A : public C<A, L, M>
{
  L l; // copyable
  M m; // only moveable
}

template<class L, class M>
class B : public C<B, L, M>
{
  L l;
  M& m;

  B(A& a, ExtraParameter ep)
    : l(a.l.subset(ep))
    , m(a.m) {}
}