我有一个带有to_string()
成员的算术自定义类型。我正在考虑在std::to_string
类型的名称空间中重载std
,但是这会算作名称空间污染吗?
编辑:
我正在考虑这一点,以便该表达式SFINAE适用于以下类型:
-> decltype(std::to_string(std::declval<T>()), void(0))
答案 0 :(得分:3)
正如Some programmer dude在comment中指出的那样,在这种情况下,您不能将声明添加到std
命名空间中。
像this post一样,一种解决方法是将to_string
写在与自定义类相同的名称空间中,并在需要时使用using std::to_string
使std::to_string
处于重载状态将to_string
用于泛型类型。以下是一个示例:
#include <string>
struct A {};
std::string to_string(A) {return "";}
namespace detail { // does not expose "using std::to_string"
using std::to_string;
template <typename T>
decltype(to_string(std::declval<T>()), void(0)) foo() {}
}
using detail::foo;
int main()
{
foo<int>(); // ok
foo<A>(); // ok
// to_string(0); // error, std::to_string is not exposed
}