Параметры вложенного шаблона и вывод типа

Привет, я практикуюсь с шаблонами и выводом типов и хотел попробовать создать простой шаблон функции с вложенными параметрами шаблона для распечатки содержимого любого контейнера stl:

template <template<T, ALLOC> CONT> 
void Print(const CONT<T, ALLOC> &c) {

    for (const T &elem : c) std::cout << elem << " ";
    std::cout << std::endl;
}

И мой тестовый пример:

int main() {
    std::list<int> intlist{ 1, 2, 3, 4, 5 };
    std::vector<float> floatvec{ 0.2f, 0.5f };

    Print(intlist);
    Print(floatvec);
}

Однако я получаю ошибку компилятора, из-за которой типы для T и ALLOC не могут быть выведены. Есть ли способ написать эту функцию без явного указания типов аргументов шаблона?

Обратите внимание, что моя цель здесь - определить тип, хранящийся в переданном в stl контейнере. Следовательно, если вектор int был передан в T, будет выведен тип Int.


person Christopher Leong    schedule 14.06.2015    source источник
comment
Сам шаблон даже не должен компилироваться .. template<T, ALLOC> CONT говорит, что CONT - это шаблон с двумя параметрами, не относящимися к типу, типами которых являются T и ALLOC. Это должно привести к поиску имен T и ALLOC, который должен завершиться ошибкой. - Как это: coliru.stacked-crooked.com/a/50c8edf643ed26f0   -  person dyp    schedule 14.06.2015
comment
О, и вы забыли class перед CONT, если это должен быть шаблон параметр-шаблона: template<template</*something*/> class CONT>   -  person dyp    schedule 14.06.2015


Ответы (1)


В вашем случае вы можете просто сделать

template <typename CONT> 
void Print(const CONT& c) {
    for (const auto& elem : c) std::cout << elem << " ";
    std::cout << std::endl;
}

Если вы хотите ограничить свою функцию Print классами шаблонов с двумя аргументами шаблона, синтаксис будет следующим:

template <template<typename , typename> class CONT, typename T, typename ALLOC> 
void Print(const CONT<T, ALLOC> &c) {
    for (const T &elem : c) std::cout << elem << " ";
    std::cout << std::endl;
}
person Jarod42    schedule 14.06.2015
comment
Спасибо, первое - это то, что у меня было изначально, но мне нужно определить тип, хранящийся в параметре CONT. Отсюда и вложенная шаблонная версия. Это кажется довольно запутанным, имея 3 параметра шаблона для самых внешних параметров шаблона и 2 параметра анонимного шаблона для класса CONT. Не могли бы вы объяснить, как я могу явно вызвать функцию печати с переданными в шаблоне аргументами? Мне нужно понять это полностью, особенно часть вывода типа. - person Christopher Leong; 14.06.2015
comment
@ChristopherLeong: контейнеры stl определяют некоторый тип для получения их параметра шаблона как std::vector<..>::value_type. - person Jarod42; 14.06.2015
comment
Вы можете вызвать Print явно с помощью Print<std::vector, float, std::allocator<float>>(floatvec); - person Jarod42; 14.06.2015