我写了这个函数,根据给定分隔符将对象容器加入到字符串中。
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_string
和Join
}:
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
发生了什么?
答案 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。