Автоматическая ссылка на параметр шаблона по умолчанию - PullRequest
0 голосов
/ 10 июля 2020

Я хотел бы сделать что-то подобное ниже. Таким образом, я мог бы получить специализацию с полем того же типа. Есть ли способ сделать что-то подобное?

template<class T = A>
struct A {
    T* t = nullptr;
};

template<class T = B>
struct B : A<T> {
   int x;
};

Чтобы это работало:

B b1, b2;
b.t = &b2;
b.t->x = 10;

Ответы [ 2 ]

0 голосов
/ 25 июля 2020

Прибил его, используя необычно повторяющийся шаблон шаблона (CRTP) идиому.

Определите это так:

template<class T>
struct BaseA {
    T* t = nullptr;
};

struct A : BaseA<A> {
};

template<class T>
struct BaseB : BaseA<T> {
   int x;
};


struct B : BaseB<B> {
   int x;
};

Итак, это работает, как ожидалось:

A a1, a2;
a1.t = &a2;
a1.t->x = 10; // compiler error, `A` does not have `x`

B b1, b2;
b1.t = &b2;
b1.t->x = 10; // OK

См. Мою демонстрацию .

0 голосов
/ 10 июля 2020

Вы можете использовать std::conditional_t, чтобы определить тип указателя на член в зависимости от того, предоставлен ли параметр шаблона:

template<class T = struct Default>
struct A { 
   std::conditional_t<std::is_same_v<T, Default>, A*, T*> t;
   int x;
};

, и аналогично вы можете наследовать от соответствующего типа в зависимости от того, является ли параметр шаблона предоставлено:

template<class T = struct Default>
struct B : A<std::conditional_t<std::is_same_v<T, Default>, B<T>, T>> { 
   int y;
};

Вот демонстрация .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...