Как определить шаблон определенного типа, который может быть унаследован? - PullRequest
1 голос
/ 01 июля 2019

Мой вопрос может быть не таким ясным, как хотелось бы. Позволь мне объяснить. У меня есть абстрактный класс матери M и много дочерних классов C1, C2, ... Cn. В каждом дочернем элементе я должен определить типы шаблонов следующим образом:

class Child1 : public Mother
{
    public:
    typedef AnotherTemplateClass<Child1,int>         Type1_C1;
    typedef AnotherTemplateClass<Child1,bool>        Type2_C1;
    typedef AnotherTemplateClass<Child1,unsigned>    Type3_C1;
    void DoSomething(Type1_C1 a, Type2_C1 b, Type3_C1);
};

Я хотел бы определить что-то вроде:

class Mother
{    
    public:
    typedef AnotherTemplateClass<this,int>          Type1_M;
    typedef AnotherTemplateClass<this,bool>         Type2_M;
    typedef AnotherTemplateClass<this,unsigned>     Type3_M;
};

и с Child1, использующим этот тип

class Child1 : public Mother
{
    void DoSomething(Type1_M a, Type2_M b, Type3_M c);
};

Я знаю, что это невозможно сделать

error: invalid use of ‘this’ at top level

но есть ли синтаксис, который мог бы решить эту проблему?

это вообще возможно?

1 Ответ

2 голосов
/ 01 июля 2019

CRTP может помочь:

template <typename Derived>
class ChildCrtp : public Mother
{
    public:
    typedef AnotherTemplateClass<Derived,int>         Type1_C1;
    typedef AnotherTemplateClass<Derived,bool>        Type2_C1;
    typedef AnotherTemplateClass<Derived,unsigned>    Type3_C1;

    Possibly:
    //void DoSomething(Type1_C1 a, Type2_C1 b, Type3_C1);
};

, а затем

class Child1 : public ChildCrtp<Child1>
{
public:
    void DoSomething(Type1_C1 a, Type2_C1 b, Type3_C1);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...