gpt4 book ai didi

c++ - 将 initializer_list 转换为可变参数模板

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:14:58 24 4
gpt4 key购买 nike

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

一种可能的用途是:

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

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

myFunction(myString, {"name", "World"}, {"number", 42});

对于任何 个参数。

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

myFunction(myString, std::make_pair("name", "World"), std::make_pair("number", 42));

具有以下功能:

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

但我不想使用对。

我该怎么办?

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

最佳答案

不完全是你问的,因为你必须调用你的函数

myFunction(myString, "name", "World", "number", 42);

代替

myFunction(myString, {"name", "World"}, {"number", 42});

但下面应该是一个示例(抱歉,baz() 未经测试)

#include <tuple>
#include <string>
#include <utility>
#include <iostream>

// fmt headers

template <typename ... Ps>
std::string baz (char const * frmt,
std::pair<char const *, Ps> const & ... ps)
{ return fmt::format(frmt, fmt::arg(ps.first, ps.second)...); }

template <typename ... Ts, std::size_t ... Is>
std::string bar (char const * frmt, std::tuple<Ts...> const & t,
std::index_sequence<Is...> const &)
{ return baz(frmt, std::get<Is>(t)...); }

template <typename ... Ts>
std::string foo (char const * frmt, std::tuple<Ts...> const & t)
{ return bar(frmt, t, std::make_index_sequence<sizeof...(Ts)>{}); }

template <typename ... Ts, typename P1, typename P2, typename ... Args>
std::string foo (char const * frmt, std::tuple<Ts...> const & t,
P1 const & p1, P2 const & p2, Args const & ... args)
{ return foo(frmt,
std::tuple_cat(t, std::make_tuple(std::make_pair(p1, p2))), args...); }

template <typename ... Args>
std::string myFunction (char const * frmt, Args const & ... args)
{ return foo(frmt, std::tuple<>{}, args...); }

int main()
{
myFunction("format", "name", "World", "number", 42);
}

注意这个例子使用了std::index_sequencestd::make_index_sequence(),所以从C++14开始编译;但是很容易为这个类和这个函数创建一个替代品来使用 C++11。

关于c++ - 将 initializer_list 转换为可变参数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42834024/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com