Как получить доступ к собственным аргументам шаблона аргумента шаблона? - PullRequest
1 голос
/ 24 января 2020

Скажем, у вас есть шаблон класса (например, second ниже). Предположим, что аргументы шаблона шаблона класса являются экземплярами другого шаблона класса (например, first ниже). Как вы получаете доступ к собственным аргументам шаблона аргумента шаблона? Это возможно?

Вот код:

template<size_t n>
class first {
};

template<typename instantiated_first>
class second {
    // would like to be able to access the "n"
    // of instantiated_first
};

int main() {
    second<first<3>> thing;

    return 0;
}

На ум приходят три возможности:

  1. переписать first для хранения n в качестве данных член или
  2. перепроектирование second для наследования от экземпляра класса от first, и
  3. для запроса одинаковых аргументов шаблона в обоих шаблонах классов.

Я спрашиваю, потому что я бы предпочел не редактировать ранее существующий код (вариант 1), и в моем конкретном приложении не имеет смысла (по крайней мере для меня) думать о second как о типе first (вариант 2). Я буду создавать экземпляры многих объектов типа specialized_first, поэтому для second имеет больше смысла «владеть» этими объектами и хранить их в контейнере. Вариант 3 тоже не выглядит очень стильным sh.

Есть ли какие-нибудь необычные функции шаблона, о которых я не знаю, чтобы сделать это sh хорошим способом?

Ответы [ 2 ]

1 голос
/ 24 января 2020

Более разумный способ - не хранить n как элемент данных, а как static constexpr size_t, чтобы не выделять дополнительное пространство времени выполнения. Это стандартный и наиболее гибкий механизм, позволяющий различным другим шаблонам получать доступ к этому параметру без суеты mu sh. Например, вы можете сделать совершенно другую версию first и позволить вашему second использовать другую версию, поддерживая оригинал, при условии, что все версии соответствуют концептуальному интерфейсу.

Аналогично, каждый * Параметр шаблона 1007 * можно пересылать пользователям шаблона через using T = T_;. В общем, параметры шаблона недоступны, если вы не позволите им быть, объявив их типами или сохранив их значение как constexpr или иначе.

Вы можете переделать second, чтобы он принимал тот же параметр шаблона, но это становится сложнее, чем больше у вас других шаблонов, которые используют first и это значение / тип, или когда вы вдруг захотите использовать second для альтернативной версии first. Лучше решать такие проблемы на root. Например, в std все их классы шаблонов имеют все необходимые типы, объявленные внутри класса аналогичным образом.

1 голос
/ 24 января 2020

Вы объявляете частичную специализацию и выбираете оттуда аргументы.

template<typename T>
class second<first<T>> {
    // T is available here for use.
};

Или, в более общем случае, делаете это

template<typename T, typename U
class second<U<T>> {
    // T is available here for use.
};

Это будет соответствовать всем экземплярам с одним аргументом шаблона.

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