gpt4 book ai didi

没有第一个的 C++ 可变参数

转载 作者:行者123 更新时间:2023-11-30 02:22:22 25 4
gpt4 key购买 nike

是否有可能使用不指定第一个参数的可变参数?

例如:

这段代码非常好:

void something(const char* layoutAndButton, ...)
{
va_list ap;
va_start(ap, layoutAndButton);
std::map<std::string, std::string> data;
while (*layoutAndButton != '\0') {
std::string layout = va_arg(ap, const char*);
++layoutAndButton;
std::string button = va_arg(ap, const char*);
++layoutAndButton;
data.insert(std::make_pair(layout, button));
}
for (auto const& x : data)
{
std::cout << x.first << ':' << x.second << std::endl;
}
va_end(ap);
}

但我希望 something 以这种方式运行:

void something(const char*...)

有没有可能做那样的事情?然后访问成员?如果是,怎么办?

谢谢

最佳答案

正如评论中所述,std::initializer_list 似乎可以完成这项工作

void something(std::initializer_list<std::pair<std::string, std::string>> layoutAndButtons)
{
// std::map<std::string, std::string> m(layoutAndButtons); // potentially
for (auto const& p : layoutAndButtons) {
std::cout << p.first << ':' << p.second << std::endl;
}
}

甚至,如果您真的需要一张 map :

void something(const std::map<std::string, std::string>& layoutAndButtons)
for (auto const& p : layoutAndButtons) {
std::cout << p.first << ':' << p.second << std::endl;
}
}

用法类似于:

something({{"Some", "things"}, {"are", "done"}});

如果你真的想要可变参数模板,我建议:

template<typename... Args>
void something(Args... args)
{
static_assert(sizeof...(Args) % 2 == 0, "wrong number of argument");
const char* layoutAndButtons[] = {args...};

std::map<std::string, std::string> m;
for (auto it = std::begin(layoutAndButtons);
it != std::end(layoutAndButtons);
it += 2) {
auto layout = *it;
auto button = *(it + 1);
m.emplace(layout, button);
}
for (auto const& p : m)
{
std::cout << p.first << ':' << p.second << std::endl;
}
}

关于没有第一个的 C++ 可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47265993/

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