読者です 読者をやめる 読者になる 読者になる

kanetaiの二次記憶装置

プログラミングに関するやってみた、調べた系のものをQitaに移して、それ以外をはてブでやる運用にしようと思います。http://qiita.com/kanetai

lexical_cast

lexical_cast - 1.47.0

atoi,atof,sprintf,sscanf, etc.を使わずに、文字列<->int,double, etc. の変換ができる。
C++11でstd::to_string()が使えるようになったので、使用頻度は減りますが、
lexical_castはoperator <<と>>を定義しときゃ使えるので、std::complexとかにも使えます。
主に、std::stringstreamを使うのが面倒なときに使う。

名前空間/ヘッダ

boost

#include <boost/lexical_cast.hpp>

例外

失敗したらboost::bad_lexical_castが投げられる。

lexical_cast_TEST.cpp

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

struct Intint{
	int a,b;
	Intint(int arg1, int arg2) : a(arg1), b(arg2){}
};
std::ostream& operator<<(std::ostream& os, const Intint& d){ return os << d.a <<"-" << d.b; }

int main(){
	double d = 10.0;
	Intint ii(2,4);
	try{
		//double->std::string
		std::string str = boost::lexical_cast<std::string>(d);
		std::cout << (str  + ": double->std::stringにしたのでoperator+が使える") << std::endl;
		//std::string->double
		std::cout<<"実数を入れてね:";
		std::cin >> str;
		std::cout << boost::lexical_cast<double>(str) + 10.0 << ": std::string->doubleにして10.0足した" << std::endl;
		//Intint->std::string
		std::cout << (boost::lexical_cast<std::string>(ii) + ": <<と>>を定義しときゃ基本的に使える") << std::endl;
	}catch(boost::bad_lexical_cast& e){
		std::cerr << e.what() << std::endl;
	}

	return 0;
}

結果

lexical_cast_TEST.exe
10: double->std::stringにしたのでoperator+が使える
実数を入れてね:0.5
10.5: std::string->doubleにして10.0足した
2-4: <<と>>を定義しときゃ基本的に使える
lexical_cast_TEST.exe
10: double->std::stringにしたのでoperator+が使える
実数を入れてね:(^ω^)
bad lexical cast: source type value could not be interpreted as target