*強調テキスト*Boost プログラム オプションを使用して、コマンド ラインからシングルバイト変数を受け入れるにはどうすればよいですか?
コマンド ライン パラメータの--id1=1 --id2=1
結果は、id1=49 (または「1」、0x31) および id2=1 の値になります。
#include <stdint.h>
#include <iostream>
#include <boost/program_options.hpp>
using namespace std;
int main(int argc, char** argv)
{
(void)argc;
(void)argv;
namespace po = boost::program_options;
const int myargc = 3;
const char* myargv[] = {"foo","--id1=1","--id2=2" };
uint8_t id1;
uint16_t id2; // works as expected.
po::variables_map vm;
po::options_description cmd_options( "Command options" );
cmd_options.add_options()
( "id1", po::value<uint8_t >( &id1 )->default_value( 0 ), "A 1-byte ID" )
( "id2", po::value<uint16_t>( &id2 )->default_value( 0 ), "A 2-byte ID" )
;
po::store( po::parse_command_line( myargc, myargv, cmd_options ), vm );
po::notify( vm );
// Using command line parameters of --id1=1 --id2=1,
// at this point, id1=49 (or '1', 0x31) and id2=1.
cout << "BPO parsing of " << myargv[1] << " and " << myargv[2] << endl;
cout << "id1: " << id1 << endl;
cout << "id1: " << (int)id1 << endl;
cout << "id2: " << id2 << endl;
id1 = boost::lexical_cast<uint8_t>("1");
id2 = boost::lexical_cast<int>("2");
cout << "Using boost::lexical_cast" << endl;
cout << "id1: " << id1 << endl;
cout << "id1: " << (int)id1 << endl;
cout << "id2: " << id2 << endl;
}
出力は次のとおりです。
BPO parsing of --id1=1 and --id2=2
id1: 1
id1: 49
id2: 2
Using boost::lexical_cast
id1: 1
id1: 49
id2: 2
Boost は最終的に boost::lexical_cast("1")' を呼び出します。これは、数値ではなく char として変換されます。「1」は 49 である「1」になります。
boost::program_options::add_options() の初期化を変更して、シングルバイ値を文字列/文字ではなく int として扱う方法はありますか? そうでない場合、解析またはマッピングを変更するために必要なオプションは何ですか? 明らかな (しかし好ましくない) オプションは次のとおりです: [1] char のような値を使用しない [2] 手動で解析する (Boost をバイパスする) または [3] Boost が解析を行った後に二次変換を実行する。