[英]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_string
和Join
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.