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

Здравейте, практикувам с шаблони и дедукция на тип и исках да опитам да направя шаблон на проста функция с вложени параметри на шаблона, за да отпечатам съдържанието на всеки 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 контейнер. Следователно, ако вектор от ints беше предаден в 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-parameter: 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 функция до шаблонни класове с 2 шаблонни аргумента, синтаксисът ще бъде:

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