[C++] 컨테이너의 요소를 출력하는 Helper 함수

출처 - http://cafe.naver.com/cppmaster/2218
// cppmaster.h<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><?xml:namespace prefix = o />
// MODULE		: CPPMASTER.h
// DESCRIPTION	: print elements in container
// AUTHOR		: kang seog min
// CONTACT		: smk6809 @ yahoo.co.kr
//					cafe.naver.com/cppmaster
// Usage :
//		int x[10] = { 1,2,3,4,5,6,7,8,9,10};
//		vector<int> v(x, x+10);
//
//		show( x );					// array
//		show( v );					// container
//		show( x, x+10);				// pointer
//		show( v.begin(), v.end() );	// iterator
//
//		show( x, false );			// no newline 

#ifndef CPPMASTER_H
#define CPPMASTER_H

#if _MSC_VER > 1000
#pragma once
#endif
#include <iterator>

template<int N> struct int2type
{
	enum { value = N };
};

template<typename T> struct is_array
{
	enum { value = false };
};

template<typename T, int N> struct is_array<T[N]>
{
	enum { value = true };
};

template<typename T> struct get_array_info
{
	enum { rank = 0 };
};

template<typename T, int N> struct get_array_info<T[N]>
{
	typedef T value_type;
	enum { rank = N };
};

// sequence 버전
template<typename T> inline void _show_imp(const T& c, bool bnewline, int2type<0> )
{
	ostream_iterator<typename T::value_type> out(cout, " ");
	copy( c.begin(), c.end(), out );

	if ( bnewline)
	{
		cout << endl;
	}
}

// Container 의array 버전
template<typename T> inline void _show_imp(const T& c, bool bnewline, int2type<1> )
{
	ostream_iterator<typename get_array_info<T>::value_type > out(cout, " ");
	copy( c, c + get_array_info<T>::rank, out );

	if ( bnewline)
	{
		cout << endl;
	}
}

// Container version
template<typename Container> inline void show( const Container& c, bool bnewline = true )
{
	_show_imp( c, bnewline, int2type<is_array<Container>::value>());
}

// Iterator version
template<typename Iterator> inline void show( Iterator first, Iterator last, bool bnewline = true)
{
	ostream_iterator< typename iterator_traits<Iterator>::value_type > out( cout, " ");
	copy( first, last, out);

	if ( bnewline )
	{
		cout << endl;
	}
}

#endif  // CPPMASTER_H



// examples
#include <vector>
#include <iostream>
#include "cppmaster.h"

using namespace std;

int main()
{
	int x[10] = { 1,2,3,4,5,6,7,8,9,10};
	vector<int> v(x, x+10);


	show(x);
	show(v);
	show( x, x+10);
	show( v.begin(), v.end());


	show( x, false ); // no new line
	show( v );
}

댓글

이 블로그의 인기 게시물

[NSIS] 32비트와 64비트 모듈 등록하는 법. (regsvr32)

[Visual Studio] Windows 7 에서 Visual Studio 6.0 디버그 시 프로세스 좀비되는 증상 해결 방법