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

在我看来,升压精神Karma是权威的现代输出格式库。

于 2011-05-17T20:55:50.837 回答
1

这是Boost.Locale的Message Formatting部分,类似于GNU gettext

在里面你会写:

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

然后翻译器将使用消息目录翻译字符串:

msgid "Hello {1} {2}!"
msgstr "こんにちは {2}-さん!"
于 2011-05-17T21:24:53.193 回答
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 回答
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

您可以通过递归应用格式来做到这一点:

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

但是,我建议改用GNU gettext之类的东西。

于 2012-12-28T05:13:17.853 回答