其他分享
首页 > 其他分享> > c – 如何重载空std :: initializer_list?

c – 如何重载空std :: initializer_list?

作者:互联网

这里我有一系列重载函数,它们都是vector或initializer_list的输入.我想在客户端代码输入空的initializer_list时处理特殊情况.问题是编译器无法确定这种空列表中的数据.所以我的问题是我如何在函数声明中解决这种情况.

#include <string>
#include <vector>

using namespace std;
void func(vector<string> v) { }
void func(vector<wstring> v) { }
void func(initializer_list<string> iv) {}
void func(initializer_list<wstring> iv) {}

int main() {
  using namespace std;
  func({"apple", "banana"});
  func({L"蘋果", L"香蕉"});
  func({}); // special case
}

错误信息:

<stdin>: In function 'int main()':
<stdin>:14:10: error: call of overloaded 'func(<brace-enclosed initializer list>)' is ambiguous
<stdin>:14:10: note: candidates are:
<stdin>:5:6: note: void func(std::vector<std::basic_string<char> >)
<stdin>:6:6: note: void func(std::vector<std::basic_string<wchar_t> >)
<stdin>:7:6: note: void func(std::initializer_list<std::basic_string<char> >)
<stdin>:8:6: note: void func(std::initializer_list<std::basic_string<wchar_t> >)

void func(initializer_list< void> iv){} – 无效.我不知道如何正确宣布它.

解决方法:

没有办法单独用参数来区分它.您可以将其中一个作为模板,然后这将成本更高,并且不太适合重载解析

void func(vector<string> v) { }
void func(vector<wstring> v) { }
template<typename = void>
void func(initializer_list<string> iv) {}
void func(initializer_list<wstring> iv) {}

现在调用func({})将优先于函数模板的最后一个函数.请注意,func({“hello”,“world”})仍然比非模板向量捕获函数更喜欢函数模板,因为参数转换成本比是否从模板合成候选更重要.

标签:c,c11,overloading,initializer-list
来源: https://codeday.me/bug/20190825/1724045.html