26601

[code]

    std::string localizedFormat(const std::string& format, const std::vector<std::string>& strVector)
    {
        std::string ret = format;
        int i = 0;
        for (const std::string& str : strVector) {
            ret = strReplace(ret, "%" + std::to_string(i) + "@", str);
            i++;
        }
        return ret;
    }
    
[/code]

上記のような関数を作りました。  
これは、format中の%0@、%1@...という文字列を、vectorに入っている文字列で置き換えていく関数です。  
(strReplace(str,from,to)という関数は、str中のfrom文字列をto文字列に置き換える関数です。)

使用例

[code]

    std::vector<std::string> vect = {"A","10","B"};
    std::string format1 = "%0@ dealt %1@ damage to %2@.";
    CCLOG("%s", localizedFormat(format1, vect).c_str());
    //"A dealt 10 damage to B."
    std::string format2 = "%0@は%2@に%1@のダメージを与えた。";
    CCLOG("%s", localizedFormat(format2, vect).c_str());
    //AはBに10のダメージを与えた。
    
[/code]

これはゲームのメッセージをローカライズするために作った関数で、format中の置換する位置が前後することがあるので、数字で置換する位置を指定しています。

これを  
std::string localizedFormat(const std::string& format, const std::string&
str,...)  
という可変長引数を取る関数にしたいのですが、どう書けばいいでしょうか。

できれば、Cのva_listとかを使うやり方でなく、C++の可変長テンプレートを使ったやりかたがいいです。  
よろしくお願いします。


CC BY-SA 3.0
2016-06-09T15:34:30.477
26597
2016-06-10T13:58:24.277
8825
question
c++11
C++での可変長引数を取る関数の書き方


基本的にはこんな感じになるでしょうか。

[code]

    template<typename ... Args>
    std::string localizedFormat(const std::string& format, const Args ... strs)
    {
        std::vector<std::string> strVector = {strs...};
        return localizedFormat(format, strVector);
    }
    
[/code]

元の`localizedFormat`は残しておいてoverloadする想定で。  
(Hidekiさんにコメントで教えていただいた修正を入れておきました。)


CC BY-SA 3.0
2016-06-09T22:32:26.057
26601
2016-06-10T13:58:24.277
2016-06-10T13:58:24.277
13972
13972
26597
answer