C++での可変長引数を取る関数の書き方

投稿者: Anonymous
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;
}

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

使用例

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

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

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

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

解決

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

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

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

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *