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

kanetaiの二次記憶装置

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

Boost.Format

The Boost Format library - 1.47.0

型、引数の数安全なprintf的なもの

名前空間/ヘッダ

boost
※一部boost::io空間

#include <boost/format.hpp>

basic_format class

以下のようにtypedefされてる

typedef basic_format<char>    format;
typedef basic_format<w_char> wformat;
使い方1(基本)

boost::format(format) % arg1 % arg2 ...
formatには、printfと同じ%〜形式のやつをいれる

使い方2(n番目の引数を指定)

formatに%n%と指定するとn番目の引数がそこに入る

使い方3(printf形式と%n%の併用)

formatに%n$〜を指定して併用可。

整形済み文字列を文字列型に変更

f.str();
boost::io::str(f) //boost::io空間

iostreamのマニピュレータを使用

group関数をbasic_formatのoperator%に渡す.
boost::io::group( Manip1, arg )
boost::io::group( Manip1, Manip2, arg )
...
10個まで定義済み

例外

//※boost::io空間
class format_error      :public std::exception; //全Boost.Formatの全例外を受け取る時に使う
class bad_format_string :public format_error;
class too_few_args      :public format_error;
class too_many_args     :public format_error;
class out_of_range      :public format_error;

エラー発生時に例外を投げるか,単に失敗するかをビットで指定

//boost::basic_formatのメンバ
unsigned char exceptions( unsigned char newexcept );
unsigned char exceptions() const;
//boost::io空間
enum boost::io::format_error_bits{
    bad_format_string_bit = 1;
    too_few_args_bit      = 2;
    too_many_args_bit     = 4;
    out_of_range_bit      = 8;
    all_error_bits        = 255; //以上の全エラーで例外を投げる
    no_error_bit          = 0;   //以上の全エラーで例外を投げない
}

format_TEST.cpp

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

namespace err{
	enum{ JP, EN, NUM_LANG};
	enum{ SECTION_BROKEN, NOT_FOUND, NUM_ERROR};
	static char* message[NUM_ERROR][NUM_LANG] = {
		{ "ファイル'%1%'の'%2%'セクションが壊れています", "'%2%' section in file '%1%' corrupted." },
		{ "実行可能な'%1%'が見つかりませんでした", "No '%1%' executable found there."			  }
	};

} //namespace err

int main(){
	try{
		std::string test = "テスト";
		//printf形式
		std::cout << boost::format("test string = '%s' ") % test;
		for(size_t i=0; i<test.size(); ++i) std::cout << boost::format("[%#02x]") % (test[i]&0xff);
		std::cout << std::endl;

		//%n%、n番目の引数を指定できる
		std::string file = "a.out", section = ".lib";
		int lang = err::JP;
		std::cout << boost::format(err::message[err::NOT_FOUND][lang]) % file << std::endl
			<< boost::format(err::message[err::SECTION_BROKEN][lang]) % file % section << std::endl;
		lang = err::EN;
		std::cout << boost::format(err::message[err::NOT_FOUND][lang]) % file << std::endl
			<< boost::format(err::message[err::SECTION_BROKEN][lang]) % file % section << std::endl;

		//%n$〜 でprintf形式と併用
		std::cout << boost::format("hex=%1$x octal=%1$o decimal=%1$d \n") % 255;

		//文字列化
		std::cout << (boost::format("hex=%1$#x ") % 255).str() + "文字列化" << std::endl;
		std::cout << boost::io::str( boost::format("hex=%1$#x ") % 255 ) + "これでもおkだがboost::io空間にある" << std::endl;

		//iostreamのマニピュレータも使える
		std::cout << boost::format("std::hexで16進数に %1%") % boost::io::group(std::hex, 255);
	}catch( boost::io::format_error& e){ //※boost::io空間
		std::cerr << e.what() << std::endl;
	}

	return 0;
}

結果

test string = 'テスト' [0x83][0x65][0x83][0x58][0x83][0x67]
実行可能な'a.out'が見つかりませんでした
ファイル'a.out''.lib'セクションが壊れています
No 'a.out' executable found there.
'.lib' section in file 'a.out' corrupted.
hex=ff octal=377 decimal=255
hex=0xff 文字列化
hex=0xff これでもおkだがboost::io空間にある
std::hexで16進数に ff