繁体   English   中英

C ++理解ADL

[英]C++ understanding ADL

我编写了此函数,以基于给定分隔符将对象的容器加入字符串。

template<typename Container>
std::string Join(Container const& input, char delimiter)
{    
    using std::to_string;

    return std::accumulate(++std::begin(input), std::end(input), to_string(*std::begin(input)) 
            , [&delimiter](std::string const& a, typename Container::const_reference b) { return a + delimiter + to_string(b); });            
}

如您所见,我已经添加了using std::to_string; 当容器的类型已经是字符串时,使用ADL解决。

并且我已经实现了( to_stringJoin in global namesapce):

const std::string& to_string(std::string const& str) {  return str; }

现在考虑以下Join调用:

Join(std::vector<std::string>{ "1", "2"}, ','); //Fail to compile
Join(std::vector<int>{ 1, 2}, ','); //Compiles

但是当我using ::to_string;添加时using ::to_string; Join

template<typename Container>
std::string Join(Container const& input, char delimiter)
{    
    using std::to_string;
    using ::to_string;            

    return std::accumulate(++std::begin(input), std::end(input), to_string(*std::begin(input)) 
            , [&delimiter](std::string const& a, typename Container::const_reference b) { return a + delimiter + to_string(b); });            
}

这两个调用都会编译:

Join(std::vector<std::string>{ "1", "2"}, ',');
Join(std::vector<int>{ 1, 2}, ',');

有人可以解释那里发生了什么吗,全局to_string发生某种“隐藏”?

using ,考虑的重载是通过在该名称中查找而找到的重载,以及通过ADL发现的重载。

三种类型均不在根名称空间中。

为了解决这个问题,写

namespsce notstd {
  std:string const& my_to_string(std::string const& in){return in;}
  std::string my_to_string(std::string&& in){return std;:move(in);}
  template<class T> std::string my_to_string( T const& in ){
    using std::to_string;
    return to_string(in);
  }
}

这不支持sfinae的早期失败。 这需要添加一个details名称空间和一些decltypes。

但是notstd::my_to_string ,您可以使用notstd::my_to_string替换using和to_string。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM