Я пытаюсь создать C ++ — Printing-Function, которая печатает любой STL-контейнер с помощью алгоритма копирования и пользовательского заголовка ранее.
Моя проблема в том, что мне нужно распечатать его с помощью алгоритма копирования, поэтому мне нужен тип шаблона для ostream_iterator («ostream_iterator»)?
Как я могу получить тип контейнера за шаблоном
(Я попробовал это с typeid (продолжение), но это не сработало — Спасибо!
template<typename Container>
void HeaderPrint(Container cont, std::string header = "" )
{
std::cout << header << std::endl;
copy(cont.begin(),cont.end(), ostream_iterator<typeid(cont)>(cout," "));
std::cout << std::endl;
}
Контейнеры стандартной библиотеки определяют value_type
с типом контейнера:
copy(cont.begin(),cont.end(), ostream_iterator<typename Container::value_type>(cout," "));
Если вы используете свой собственный контейнерный класс, было бы разумно также использовать это соглашение:
template <typename T>
class MyContainer
{
public:
typedef T value_type;
....
};
juanchopanza ответил о типе контейнера, но есть и другой способ.
Все стандартные контейнеры имеют begin()
метод. Чтобы получить его тип, используйте decltype
, Итак, ваш метод будет:
template<typename Container>
void HeaderPrint(Container cont, std::string header = "" )
{
std::cout << header << std::endl;
copy(cont.begin(),cont.end(), ostream_iterator<decl_type(*cont.begin())>(cout," "));
std::cout << std::endl;
}
Я все еще нахожу как сказал Хуанхопанза лучше.