Функция печати шаблонов C ++ - PullRequest
0 голосов
/ 06 сентября 2018

До сих пор я писал это:

template <typename TType>
void print_vector(const std::vector<TType>& vec)
{
    typename  std::vector<TType>::const_iterator it;
    std::cout << "(";
    for(it = vec.begin(); it != vec.end(); it++)
    {
        if(it!= vec.begin()) std::cout << ",";
        std::cout << (*it);
    }
    std::cout << ")";
}

template<>
template <typename T2>
void print_vector(const std::vector< std::vector<T2> >& vec)
{
    for( auto it= vec.begin(); it!= vec.end(); it++)
    {
        print_vector(*it);
    }
}

Первая функция отлично работает для таких вещей, как std::vector< double> и так далее.Теперь я хочу иметь возможность печатать std::vector< std::vector< TType>> вещей также.Вторая часть не компилируется, но у меня есть «идея» решения моей задачи.Любые предложения о том, как добиться такого поведения?

Compilation Error: too many template-parameter-lists

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Если вы сделаете свою функцию для печати базовых типов и переопределите вектор, используя себя рекурсивно:

template<typename T>
void print( const T &t ) 
{ 
    std::cout << t; 
}

template<typename T>
void print( const std::vector<T> &v ) 
{ 
    std::cout << '[';
    for( auto it = v.begin(); it != v.end(); ++it ) {
         if( it != v.begin() ) std::cout << ',';
         print( *it );
    }
    std::cout << ']';
}

тогда вам не нужно писать специальный вектор для векторов или векторов векторов и т. Д.

живой пример

0 голосов
/ 06 сентября 2018

Возможно, вы захотите пойти к более общему решению проблемы, позволяющему печатать практически любой итеративный тип:

#include <vector>
#include <iostream>

template <typename Iterable>
std::ostream& operator<<(std::ostream& os, const Iterable& vals)
{
    for (const auto& val : vals)
        os << val << std::endl;
    return os;
}

int main()
{
    auto simple_vec = std::vector<int>{3, 5 , 7};
    std::cout << simple_vec;
    auto nested_vec = std::vector<std::vector<int>>{{1, 2}, {3, 4}};
    std::cout << nested_vec;
}

Для дальнейшего усовершенствования этого решения вы можете попробовать использовать SFINAE, чтобы убедиться, что шаблон << доступен только для повторяемых типов.

0 голосов
/ 06 сентября 2018

Удалите часть template<>, перегрузка шаблона функции будет работать нормально.

template <typename TType>
void print_vector(const std::vector<TType>& vec)
{
    typename  std::vector<TType>::const_iterator it;
    std::cout << "(";
    for(it = vec.begin(); it != vec.end(); it++)
    {
        if(it!= vec.begin()) std::cout << ",";
        std::cout << (*it);
    }
    std::cout << ")";
}

template <typename T2>
void print_vector(const std::vector< std::vector<T2> >& vec)
{
    for( auto it= vec.begin(); it!= vec.end(); it++)
    {
        print_vector(*it);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...