这是我的问题的延续:Why isn't std::begin/end being considered here?
我正在将我的自定义库代码移动到namespace Toolbox
- 包括contains
模板和begin
以及end
CStringA
和CStringW
{1}}。
我有一个模板自由函数算法“包含”:
namespace Toolbox {
template <typename collection_type, typename element_type, typename comparison_function_type>
bool contains(const collection_type & collection, const element_type & element, comparison_function_type comparison_function)
{
using namespace ::std;
return end(collection) != find_if(begin(collection), end(collection), [&](const element_type & candidate) { return comparison_function(candidate, element); });
}
} // NS
这适用于以下内容或以下内容取决于范围内的内容(以下是全局NS):
static const TCHAR * kPackFiles[] = { _T("boxit"), _T("pack") };
const auto & name = filename.GetName();
if (contains(kPackFiles, name, Toolbox::case_insensitive_equal_to<Toolbox::TCHARStringPolicy>()))
do_something_interesting();
以上编译除非以下内容在此范围内:
namespace Toolbox {
template <typename T>
const typename ::std::enable_if<::std::is_same<T, CStringA>::value || ::std::is_same<T, CStringW>::value, T>::type::XCHAR *
begin(const T & str) { return str.GetString(); }
template <typename T>
const typename ::std::enable_if<::std::is_same<T, CStringA>::value || ::std::is_same<T, CStringW>::value, T>::type::XCHAR *
end(const T & str) { return str.GetString() + str.GetLength(); }
} // NS Toolbox
以上内容旨在扩展CStringA
和CStringW
以提供const char_type
迭代器。这通常适用于其他方案,例如for (c : my_cstring) cout << c;
但如果begin
的{{1}}和end
重载在范围内,那么编译器甚至不会考虑CString
命名空间中的任何内容!啊!
所以我不知道NS系统是如何实际工作的 - 我看到规则(现在) - 它只考虑最近的NS,如果有什么可以匹配(尽管显然是SFINAE)那么编译器停止查找,块无法编译。 :(
我需要一些方法让我的库以一种方式引入类/自由函数/算法/类型,这仍然允许在尝试解决std
和begin
等重载时考虑std命名空间在上面的例子中!
我在这里不知所措。
我当然可以将所有算法 - 例如end
移出到全局NS。但是现在我觉得我犯了一个错误 - 是不是NSes应该明确解决(意外)名称冲突?但是,如果我将我的算法移动到全局NS中,我会“污染”全局NS,如果我将它们放入NS库中,那么我与NS规则不一致 - 我认为 - 旨在打破这个问题?
我的目标是能够让客户完全控制在任何特定时间可以考虑的资格 - 并且不是由我的图书馆预先决定,而是使用默认的退款,以便 - 在此{{例如,如果用户没有更好地自定义所涉及的数据类型的开始/结束,则使用合理的默认值。不要停留在其他一些库扩展名并说“随便,我(编译器)放弃。”
我需要它继续搜索,直到它找到工作匹配或根本没有。
所以:
1.我在contains
/ contains
begin
的定义中弄乱了SFINAE吗?
2.如果我没有弄乱这个并且SFINAE按预期工作,那么我如何让NSes为我工作而不是反对我呢?
感谢您提供的任何帮助!