Как добавить общие функции к шаблонам классов? - PullRequest
0 голосов
/ 03 мая 2019

У меня есть два класса шаблонов, псевдокод:

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. Так что я мог бы быть другим,но b.m_ref ссылается на a.m.)

В зависимости от L и M, я хочу добавить некоторые функции-члены, которые добавляются к обеим функциям.Для этих функций необходим доступ к L и M. (как) это возможно?

edit: Подчеркните зависимость от L и M.Будут разные комбинации L и M, и некоторые из них позволяют использовать дополнительные функции-члены и / или специализируются на использовании функций L или M.

Я пытался добавить этидо B и сделал A ребенка B.Но мне не удалось придумать оператор перемещения для A, который обновляет m_ref. edit: я нашел оператора перемещения, приведя this к B.Мне все еще не нравится это, но я подошел близко к этому вопросу, так как проблема решена.

Я думал о добавлении новой функции-члена в шаблон третьего класса C и создании обоих (A и B) дети C.Но я не смог придумать способ дать ссылку на M.CRTP, кажется, не подходит, поскольку только L и M должны быть параметрами шаблона C.

1 Ответ

2 голосов
/ 03 мая 2019

Похоже, вы неправильно поняли, что вы можете сделать с 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) {}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...