C ++理解ADL

时间:2016-03-13 09:40:19

标签: c++

我写了这个函数,根据给定分隔符将对象容器加入到字符串中。

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); });            
}

正如您所看到的,当容器的类型已经是字符串时,我已经为ADL工作添加了using std::to_string;

我已在全球域名中实施(to_stringJoin}:

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;添加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}, ',');

有人可以解释那里发生了什么,是否有某种&#34;隐藏&#34;全球to_string发生了什么?

1 个答案:

答案 0 :(得分:0)

当您Intent i = new Intent(mContext, SyncService.class); i.putExtra("insight", (Parcelable) interface); mContext.startService(i); public static class SyncService extends SynchronousIntentService interface= intent.getExtras().getParcelable("interface"); 时,所考虑的重载是通过查找名称匹配找到的,以及通过ADL找到的重载。

没有thr类型在根命名空间中。

要解决此问题,请写

using

这不支持sfinae早期失败。这需要添加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); } } 命名空间和一些decltypes。

但除此之外,你可以用details替换你的using和to_string。