gpt4 book ai didi

c++ - 消除 std::vector 的列表初始化歧义

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:18:49 29 4
gpt4 key购买 nike

我的代码中有一个带有类型签名的重载函数:

void foo(std::string);
void foo(std::vector<std::string>);

我希望 foo 的用户能够使用字符串或字符串列表来调用它

//Use case 1
foo("str");

//Use case 2
foo({"str1","str2","str3"});
foo({"str1","str2","str3","str4"});

问题是当调用者将 两个 字符串传入 foo 的初始化列表时。

//Problem!
foo({"str1","str2"});

这个对 foo 的调用是不明确的,因为它匹配两个类型签名。这是因为显然 {"str1","str2"}std::string 的有效构造函数

所以我的问题是,我可以在 foo 的声明或实现中做些什么来维护我上面描述的 API 而不会遇到这种模棱两可的构造函数情况。

我不想定义自己的字符串类,但我可以定义其他东西而不是 vector<string>只要它可以用字符串的初始化列表进行初始化。

只是出于好奇,为什么字符串构造函数接受 {"str1","str2"}

最佳答案

{"str1","str2"}匹配std::string接受两个迭代器的构造函数。构造函数 6 here .它会尝试从“str1”的开头迭代到“str2”的开头,这是未定义的行为。

您可以通过为 std::initializer_list<const char*> 引入重载来解决这种歧义。转发到 std::vector<std::string>过载。

void foo(std::string);
void foo(std::vector<std::string>);

void foo(std::initializer_list<const char*> p_list)
{
foo(std::vector<std::string>(p_list.begin(), p_list.end()));
}

关于c++ - 消除 std::vector<std::string> 的列表初始化歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43921281/

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