본문 바로가기

Programming/CPP Boost

[Boost] boost::lexical_cast를 사용하는 형변환

반응형

C/C++은 int 형을 std::string으로 변경하거나 std::string을 int로 변경하는 다양한 방법이 존재합니다.

다만 그 방법이 직관적이지 않기 때문에 파악하기가 쉽지 않은 단점이 있습니다.

C에서는 strtol(), atoi() 등의 함수가 제공이 되서 상호 변환을 할 수 있습니다.

C++에서는 다음과 같은 형식으로 string을 int 형식으로 변경이 가능합니다.

#include <iostream>
#include <string>
#include <boost/lexical_cast.hpp>

void main()
{
	std::stringstream ssNum("5");
	int i = 0;
	ssNum >> i;

	std::cout << ssNum.str() << std::endl << i << std::endl;
}

std::stringstream을 이용해서 간편하게 int로 변환할 수 있습니다.

또한 std::stringstream은 str()을 사용해서 std::string으로 변환이 가능합니다.

출력하면 동일한 값이 나오는 것을 확인할 수 있습니다.

boost에는 lexical_cast라는 편리한 변환이 존재합니다.

lexical_cast를 통해서 다양한 형변환을 동일한 방법으로 할 수 있습니다.

또한 기존의 xxx_cast 형태와 동일한 형태로 사용이 가능한 점도 장점입니다.

코드는 다음과 같습니다.

#include <iostream>
#include <string>
#include <boost/lexical_cast.hpp>

void main()
{
	using boost::lexical_cast;
	using boost::bad_lexical_cast;

	int i = 500;
	char chVal[3] = { '1', '0', '0' };
	char chInval = 'x';

	try
	{
		std::string szVal = lexical_cast<std::string>(i);
		std::cout << szVal << std::endl;

		i = lexical_cast<int>(chVal, 3);
		std::cout << i << std::endl;

		// It raise boost::bad_lexical_case exception.
		i = lexical_cast<int>(chInval);
		std::cout << i << std::endl;
	}
	catch (bad_lexical_cast e)
	{
		std::cout << e.what() << std::endl;
	}
}

lexical_cast<type>(value)의 형태로 사용하면 됩니다.

간단하게 string과 int간의 변환이 가능하며 nullptr로 끝나지 않는 char형 배열도 지원합니다.

이 때는 뒤에 자리수를 함께 넣으면 됩니다.

lexical_cast는 예외가 발생할 경우에 bad_lexical_cast 예외를 전달합니다.

해당 예외를 받아서 처리하면 됩니다.

위의 코드에서는 마지막 lexical_cast에서 예외가 발생하게 됩니다.

boost의 lexical_cast를 통해서 일관된 방법으로 편리한 형변환이 가능합니다.

반응형

'Programming > CPP Boost' 카테고리의 다른 글

[Boost] Visual Studio 2013에 Boost 적용해서 개발하기  (0) 2015.02.09
[Boost] Boost 빌드 방법  (0) 2015.02.07