0

C++ で変数を使用できるメッセージ ルックアップ テーブルを作成する簡単な方法はありますか。

たとえば、C では次のようなものを使用できます。

const char* transaction_messages[] = {
"UNAUTHORIZED",
"UNKNOWN_ORDER",
"UNKNOWN_DEALER",
"UNKNOWN_COMMODITY",
"INVALID_MESSAGE",
"BOUGHT %d %s @ %f.1 FROM %s", //amount, commodity, price, dealer
"SOLD %d %s @ %f.1 FROM %s", //amount, commodity, price, dealer
"%d HAS BEEN FILLED", //order id
"%d HAS BEEN REVOKED", //order id
"%d %s %s %s %d %f.1 HAS BEEN POSTED", //order id, dealer, side, commodity, amount, price
"%d %s %s %s %d %f.1" //order id, dealer, side, commodity, amount, price
};

そして、次のように関数で使用します。

void myfunction(int amount, char* commodity, double price, char* dealer){

    char *msg = transaction_message[6];
    printf(msg, amount, commodity, price, dealer);
}

同じことが次のように見える << 演算子で何かをする必要があるのではなく、ostream で同じことができるようにしたいです。

ostream << "BOUGHT" << amount << " " << commodity << " @ " << price << " FROM " << dealer;

私が今これを行うと考えることができる唯一の方法は、文字列を返す一連のインライン関数を用意し、char* テーブルの代わりにインライン関数を検索する関数テーブルを用意することです。もっと簡単な方法があるはずです。

4

3 に答える 3

1

あなたがやっていることは、ローカリゼーション (AKA L10N) と非常によく似ています。

これにはいくつかの質問があります:文字列のローカライズを設計するための最良の方法

しかし、すでにこれに対処しているパッケージがいくつかあります。
これらは基本的に、アプリケーションからすべての文字列を取得し、それらを別のリソースにパッケージ化するように設計されています (適切なリソース (通常はロケールによって異なります) が実行時に選択されます)。しかし、彼らは通常、正しいリソース文字列を見つけるためのルックアップテキストとして「英語」(または英語以外のプログラマーの場合は元のテキストと言うべきです)を使用し(したがって、コードは開発者にとって依然として読み取り可能です)、ユーザーは言語固有の文字列表示。

もちろんブーストも1つ

しかし、他にもあります(簡単なグーグル検索)

その他のリソース:

しかし、正しい文字列を取得することは、戦いの半分にすぎません。次に、実行時の値を文字列内のプレースホルダーと正しく交換する必要があります。個人的には、 boost::formatが本当に優れていると思うところです。

例:

sprintf("The time is %s in %s.", time, country);

問題は、言語によって名詞と動詞の順序が異なることです。たとえば、翻訳すると

「ドイツの時刻は 12:00 です。」

アゼルバイジャンに

「Saat Almaniya saat 12:00 deyil.」

「ドイツ」(Almaniya)を表す単語が時間と場所が入れ替わっていることに気付くでしょう。したがって、特定の順序でアイテムを置き換えるという単純なタスクは機能しません。必要なのは、インデックス付きのプレースホルダーです。(boost::format で救出)。

std::cout << boost::formt("The time is %1 in %2.") << time << country;
// Notice the place holders are number '%1' means the first bound argument
// But the format string allows you to place them in any order in the string
// So your localized resource will look like this:

std::cout << boost::formt("Saat %2 saat %1 deyil.") % time % country;

または、より可能性が高い:

std::cout << boost::formt(I10N.get("The time is %1 in %2.")) % time % country;
于 2012-05-15T15:30:04.303 に答える
0

C++ ではboost::format、タイプ セーフとして使用できますsprintf()

于 2012-05-15T15:16:34.460 に答える
0

どうですか:

ostream& ToString(ostream&O, int amount, char* commodity, double price, char* dealer)
{
  char buf[80];

  char *msg = transaction_message[6];
  sprintf(msg, amount, commodity, price, dealer);

  return O << buf;
}
于 2012-05-15T15:17:14.580 に答える