template <class T>
class A {};
A<int> a;
Теперь, нужно объявить переменную b такого типа, который является специализацией a. (В данном случае int, а если бы было A< double > a, то b должна была быть объявлена как double)
Если не хочется менять 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;
, но это довольно неудобно.
Такой вариант не слишком пугает?...
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;
}
Можно воздвигнуть что-то такое для "выдирания" любого типового аргумента по индексу
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
Виртуальный выделенный сервер (VDS) становится отличным выбором
Задача: 1) ввести 10 цифр с клавиатуры, 2) вывести длину самой длинной последовательности повторяющихся чисел в списке