3

(注: Boost.Format については知っています。次のことを行うためのより良い方法を探しています。)
最初のユースケースの例: 一部の国では、姓を最初に呼び名を最後に呼ぶことで人に名前を付けます。 、他の国では正反対です。

さて、私のコードでは、現在、次の方法で Boost.Format を使用してこれを解決しています。

#include <boost/format.hpp>
#include <iostream>
#include <stdlib.h>
#include <utility>

int main(){
    using namespace boost;

    int pos1 = 2, pos2 = 1;
    char const* surname = "Surname", *forename = "Forename";

    // decision on ordering here
    bool some_condition = false;

    if(some_condition)
      std::swap(pos1,pos2);

    char buf[64];
    sprintf(buf,"Hello %c%d%c %c%d%c",'%',pos1,'%','%',pos2,'%');
    // buf == "Hello %[pos1]% %[pos2]%"; with [posN] = value of posN

    std::cout << format(buf) % surname % forename;
}

さて、私はそれを次のようにしたいと思います。つまり、format行内のすべて:

std::cout << format("Hello %%1%% %%2%%") % pos1 % pos2 % surname % forename;

しかし、悲しいことに、素晴らしい解析例外が発生するため、それは機能しません。

実際の位置フォーマットを持つライブラリはありますか? または、私が知らない Boost.Format でこれを達成する方法さえありますか?

4

6 に答える 6

1

これは、GNU gettextに似たBoost.LocaleのMessage Formatting部分です。

その中に次のように書きます。

cout << format(translate("Hello {1} {2}!")) % forename % surname << endl;

次に、翻訳者がメッセージ カタログを使用して文字列を翻訳します。

msgid "Hello {1} {2}!"
msgstr "こんにちは {2}-さん!"
于 2011-05-17T21:24:53.193 に答える
1

私の意見では、Boost . スピリットKarmaは、決定的な最新の出力書式設定ライブラリです。

于 2011-05-17T20:55:50.837 に答える
0

format を再帰的に適用することでこれを行うことができます。

cout << format(str(format("%%%1%%% %%%2%%%") % pos1 % pos2)) % surname % forname;

ただし、代わりにGNU gettextなどを使用することをお勧めします。

于 2012-12-28T05:13:17.853 に答える
0

?:

char const* surname = "Surname", *forename = "Forename";
bool swapFlag = (some_condition) ? true : false;

std::cout << "Hello " << (swapFlag ? surname : forename) << " " << (!swapFlag ? surname : forename) << std::endl;
于 2011-05-17T21:07:49.873 に答える
0

補間する値を交換するだけです

std::swap(surname, forename)

それは仕事をするでしょう。それらを台無しにしたくない場合は、参照を用意してください:

const std::string& param1(bSwapThem? forename : surname);
const std::string& param2(bSwapThem? surname  : forename);

接吻

于 2011-05-17T20:56:19.697 に答える
0

システム ロケールにあるはずの何かのように聞こえますが、現在サポートされているようには見えません。

簡単な方法はどうですか?

   if(some_condition)
      std::cout << surname << " " << forename;
   else
      std::cout << forename << " " << surname;
于 2011-05-17T21:00:38.287 に答える