调用与方法名称相同的函数

我试图定义一个在类型上有一些操作的模板类。 应该实现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命名空间中的函数,而不管引用来自哪个名称空间。

链接地址: http://www.djcxy.com/p/66537.html

上一篇: Call function with same name as method

下一篇: more dependent types with variadic templates