C ++ наследование шаблонов скрывает параметры шаблона - PullRequest
0 голосов
/ 01 июня 2018
template <typename>
struct B
{
    constexpr static int T = 5;
};

template <int T>
struct D : B<int>
{
    constexpr static int value = T;
};

int main()
{
    std::cout << D<7>::value << std::endl; // 5, how to get 7 ?
}

Демонстрация

Поскольку я недавно узнал, что параметры шаблона производного класса шаблона проверяются после имен в базовом классе во время поиска.При этом, существует ли в любом случае квалификация имени T инициализация value для ссылки на параметр шаблона T производного класса?

РЕДАКТИРОВАНИЕ:

Пока что из обсуждений в комментариях не кажется, что единственный способ достичь этого - сделать зависимость типа / значения базового класса, что приведет к задержке поиска имен базы (к фазе создания экземпляра) и, таким образом, к созданию единственногодоступное значение для T - параметр шаблона.

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Я не совсем уверен, что понимаю вопрос, но думаю, decltype делает то, что вы хотите:

template <int T>
struct D : B<decltype(T)>
{
    constexpr static decltype(T) value = T;
};
0 голосов
/ 01 июня 2018

Для ссылки на значение T шаблона B (которое не зависит от параметра шаблона B):

#include <iostream>

template <typename>
struct B
{
    constexpr static int T = 5;
};

template <int T>
struct D : B<decltype(B<void>::T)>
{
    constexpr static int value = T;
};

int main()
{
    std::cout << D<7>::value << std::endl;
}

Для ссылки на тип параметра шаблона T изшаблон D:

#include <iostream>

template <typename>
struct B
{
    constexpr static int T = 5;
};

template <int T>
struct D : B<decltype(T)>
{
    constexpr static int value = T;
};

int main()
{
    std::cout << D<7>::value << std::endl;
}
0 голосов
/ 01 июня 2018

Поскольку B является шаблоном, вы можете изменить его, чтобы сделать его зависимым базовым классом D:

template <typename, int = 0>
struct B {
    constexpr static int T = 5;
};

template <int T>
struct D : B<int, T> {
    constexpr static int value = T; // name lookup of base T is deferred
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...