Ссылка на тип шаблона в параметре шаблона - PullRequest
0 голосов
/ 11 мая 2018

Если у меня есть шаблон класса A, например,

template <int n>
class A{
    /* some code */
};

Возможно ли иметь шаблон класса B, который принимает ссылку или указатель на A в качестве параметра, не используя int n в качестве шаблонапараметр в B.

Будет работать следующий код:

template <int n, A<n> &a>
class B{
    /* some code */
};

Но чтобы использовать это, мне всегда нужно предоставить 2 параметра для B, что будет работать, но неудобно.

В c ++ 17 использование auto будет работать следующим образом

template <auto &a>
class B{
    /* some code */
};

Но я должен работать с arm-none-eabi-gcc, который, очевидно, не поддерживает c ++ 17.

Так что я хотел бы знать, есть ли другой способ создания такого шаблона, так что B нужен только 1 аргумент шаблона.

1 Ответ

0 голосов
/ 12 мая 2018

Если я правильно вас понял, цель состоит в том, чтобы получить аргумент шаблона A и убедиться, что тип B, для которого создается экземпляр, на самом деле A.Вы можете сделать это с помощью простого метапрограммирования, определив свои собственные черты типа для A.

#include <type_traits>

template <int n>
class A {};

template <typename T>
struct is_A : std::false_type {};

template <int m>
struct is_A<A<m>> : std::true_type {
    static constexpr int const n = m;
};

template <typename A>
class B {
    static_assert(is_A<A>::value,"!");
    static constexpr int const n = is_A<A>::n;
};

int main() {
    B<A<1>>{};
}

Живой пример

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