调用与方法名称相同的函数
我试图定义一个在类型上有一些操作的模板类。 应该实现ToString方法,以便在Tools类模板实例化的任何类型的名称空间中调用ToString。
namespace X
{
class SomeType
{
};
std::wstring ToString(SomeType)
{
// ...
}
}
template<class T>
class Tools
{
static auto ToString(T& t)
{
return ToString(t);
}
}
我在ToString的Tools实现中遇到错误。 编译器尝试再次递归调用ToString方法,而不是在名称空间X中调用ToString。
我不能使用X :: ToString,因为当我尝试使用命名空间Y中的类型实例化Tools类时,会失败。例如,如果我使用:
namespace Y
{
class SomeOtherType
{
};
std::wstring ToString(SomeOtherType)
{
// ...
}
}
Y::SomeOtherType someOtherType;
auto s = Tools<Y::SomeOtherType>::ToString(someOtherType); // Would fail as SomeOtherType isn't in namespace X.
是否有可能做到这一点?
我正在使用VS 2015更新3.为此提供解决方案是首选。
相关:使用具有相同声明的类方法调用全局函数
好的,我可能有一个解决方案。 使用不同的名称添加一个在类外部的中间函数,然后使用正确的名称进行调用。
加
namespace ImplementationDetail
{
template< class T >
auto ToStringHelper(T& t)
{
return ToString(t);
}
}
template<class T>
class Tools
{
auto ToString(T& t)
{
return ImplementationDetail::ToStringHelper(t);
}
}
明确使用
return ::X::ToString(t);
引用X
命名空间中的函数,而不管引用来自哪个名称空间。