Разрешение параметров шаблона шаблона класса быть видимым в производном классе - PullRequest
1 голос
/ 30 января 2020

Я хочу сохранить видимость аргументов параметров шаблона класса при наследовании от него. Базовый класс будет иметь большое количество аргументов шаблона, поэтому я не хочу продолжать спрашивать их в шаблонах производного класса. Это единственный способ сделать это с псевдонимами типа?

Например, это не работает, но это происходит, если я заменяю все в комментариях:

#include <iostream>

template<typename one, typename of, typename very, typename many, typename tparams>
class first {
// public:
//  using A = one; //needs to be uncommented to work
};

template<typename class_instance>
class second : public class_instance {
    typename class_instance::one m_data;
    //typename class_instance::A m_data; // would work if we uncommented
};


int main() {

    second<first<int,int,int,int,int>> thing;

    return 0;
}

1 Ответ

2 голосов
/ 30 января 2020

Вы можете сохранить вид, чтобы упростить его, используя параметр шаблона * variadi c . Изменение second на

template<template<typename...> typename class_instance, typename... Params>
class second  {
public:
    template <std::size_t I>
    using param_t = std::tuple_element_t<I, std::tuple<Params...>>;
    param_t<1> foo;
};

Вы можете использовать его как

int main() {
    second<first, int, double, float, long, long long> foo{};
    foo.foo = 42.1;
    std::cout << foo.foo;
}

, который выводит

42.1

, как вы можете видеть в этом прямом эфире пример .

Да, теперь вы используете число, которое может не стоить того, но оно удаляет большую часть плиты котла. Если вы действительно хотите, вы можете даже добавить enum к second и использовать его как

template<template<typename...> typename class_instance, typename... Params>
class second  {
public:
    enum { one, of, very, many, tparams };
    template <std::size_t I>
    using param_t = std::tuple_element_t<I, std::tuple<Params...>>;
    param_t<of> foo;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...