将initializer_list转换为可变参数模板

Ood*_*ini 5 c++ variadic variadic-templates c++11 fmt

我使用名为 fmt 的格式化库(http://fmtlib.net/latest/)。

可能的用途之一是:

fmt::format("Hello, {name}! The answer is {number}. Goodbye, {name}.", fmt::arg("name", "World"), fmt::arg("number", 42));
Run Code Online (Sandbox Code Playgroud)

我想将此调用包装在一个函数中,我将其调用为:

myFunction(myString, {"name", "World"}, {"number", 42});
Run Code Online (Sandbox Code Playgroud)

对于任意数量的参数。

到目前为止,我只成功地完成了一个可使用成对列表调用的函数:

myFunction(myString, std::make_pair("name", "World"), std::make_pair("number", 42));
Run Code Online (Sandbox Code Playgroud)

具有以下功能:

std::string myFunction(const char* str, const Args&... rest) const
{
    return fmt::format(mLocale.getPOILabel(label), fmt::arg(rest.first, rest.second)...);
}
Run Code Online (Sandbox Code Playgroud)

但我不想使用成对的。

我应该怎么办 ?

PS:fmt::arg不能在函数之间传递。

Cal*_*eth 0

尝试移动 fmt::arg 的结果,而不是复制或传递 const 引用。

template<typename ... Args>
std::string myFunction(const char* str, Args&&... rest) const
{
    return fmt::format(mLocale.getPOILabel(label), std::forward<Args...>(rest)...);
}

myFunction(myString, fmt::arg("name", "World"), fmt::arg("number", 42));
Run Code Online (Sandbox Code Playgroud)