我有两个模板类,伪代码:
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
)
取决于L
和M
,我想添加一些同时添加到两个函数中的成员函数。此功能需要访问L
和M
。
(如何)?
编辑:强调L
和M
的依赖项。 L
和M
将有不同的组合,并且其中一些允许额外的成员函数和/或专门使用L
或M
的功能。 >
我试图将它们添加到B
中,并使A
成为B
的子代。但是我无法为A
提出一个移动操作符来更新m_ref
。
edit:我通过将this
强制转换为B
来找到移动操作符。我仍然不喜欢这样,但是我解决了这个问题,因为问题已经解决了。
我考虑过将新的成员函数添加到第三类模板C
中,并使A
的两个子集(B
和C
成为子元素。但是我无法想到一种提供对M
的引用的方法。 CRTP似乎不合适,因为只有L
和M
是C
的模板参数。
答案 0 :(得分:2)
听起来好像您误解了CRTP可以做什么。模板库可以将L
和M
作为参数
// 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) {}
}