Как узнать тип специализации переменной?

110
30 ноября 2019, 17:10
template <class T>
class A {};
A<int> a;

Теперь, нужно объявить переменную b такого типа, который является специализацией a. (В данном случае int, а если бы было A< double > a, то b должна была быть объявлена как double)

Answer 1

Если не хочется менять class A, тогда так:

template <typename T> struct foo {};
template <typename T> struct foo<A<T>> {using type = T;};
template <typename T> using foo_t = typename foo<T>::type;
A<int> a;
foo_t<decltype(a)> x; // int x

В принципе, вводить foo_t не обязательно. Можно каждый раз писать typename foo<decltype(a)>::type x;, но это довольно неудобно.

Answer 2

Такой вариант не слишком пугает?...

template <class T>
class A
{
public:
    using type = T;
};

int main(int argc, const char * argv[])
{
    A<int> a;
    decltype(a)::type b;
    cout << typeid(b).name() << endl;
}
Answer 3

Можно воздвигнуть что-то такое для "выдирания" любого типового аргумента по индексу

template <typename T, unsigned I> struct ArgTi;
template <template <typename ...> class T, typename ...Args, unsigned I>
struct ArgTi<T<Args ...>, I>
{
  using type = typename std::tuple_element<I, std::tuple<Args ...>>::type;
};

а потом

A<int> a;
ArgTi<decltype(a), 0>::type b; // <-- int
READ ALSO
Вывод содержимого файла Java

Вывод содержимого файла Java

Есть такие блоки кода:

153
Сравнение чисел типа Integer в ArrayList с помощью == и equals()

Сравнение чисел типа Integer в ArrayList с помощью == и equals()

Задача: 1) ввести 10 цифр с клавиатуры, 2) вывести длину самой длинной последовательности повторяющихся чисел в списке

143
Сохранение токена для тестов

Сохранение токена для тестов

Есть класс, в котором я получаю токен:

127