Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何向模板类添加公共函数?_C++_Templates - Fatal编程技术网

C++ 如何向模板类添加公共函数?

C++ 如何向模板类添加公共函数?,c++,templates,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) {} // +c

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

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
}
模板
甲级
{
L;//可复制
M;//仅可移动
}
模板
B类
{
L;
M&M_参考;
B(A&A,外部参数ep)
:l(a.l.子集(ep))
,m(a.m){}
//+复制和移动构造函数和运算符
}
(这里的想法是使用
B
作为
A
部分的引用。因此l可能不同,但是
B.m\u ref
引用了
A.m

根据
L
M
,我想添加一些添加到这两个函数中的成员函数。此功能需要访问
L
M
(如何)这是可能的?

编辑:根据
L
M
突出显示。
L
M
将有不同的组合,一些组合允许额外的成员功能和/或专门使用
L
M
的功能

我试图将这些添加到
B
,并使
A
成为
B
的孩子。但是我没有为
A
找到一个移动操作符来更新
muref
。 编辑:我通过将
this
强制转换为
B
找到了移动操作符。我仍然不喜欢这个,但我接近了这个问题,因为问题已经解决了


我考虑将新成员函数添加到第三类模板
C
,并使(
a
B
)都成为
C
的子类。但是我想不出一种方法来提供对
M
的引用。CRTP似乎不合适,因为只有
L
M
应该是
C

的模板参数。听起来您误解了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) {}
}
//基本模板
模板
C类
{
};
//某对L,M的部分特化
模板
C类
{
};
模板
A类:公共C类
{
L;//可复制
M;//仅可移动
}
模板
B类:公共C类
{
L;
M&M;
B(A&A,外部参数ep)
:l(a.l.子集(ep))
,m(a.m){}
}

我不理解你关于CRTP的理由。似乎CRTP可以在这里完成这项工作。只需将
getL
/
getM
函数放入
A
B
,CRTP应该调用这些函数来获取
L
M
“为什么
L
M
应该是
C
的模板参数?”
C
可以访问
l
m
@Caleth我需要专门研究
C
的不同组合
l
m
。我想确定的是,
A
B
调用相同的逻辑,在
C
中具有相同的功能。