2016-09-17 5 views
0

型に対していくつかの操作を持つテンプレートクラスを定義しようとしています。 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のツール実装でエラーが発生しました。コンパイラは、名前空間XのToStringを呼び出す代わりに、再帰的にToStringメソッドを再呼び出ししようとします。

X :: ToStringを使用することはできません。たとえば、私が使用する場合:

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 Update 3を使用しています。それに適したソリューションが好まれます。

関連:calling a global function with a class method with the same declaration

+1

なぜ 'X :: ToString()'がうまくいかないのか分かりません。どういう意味ですか? – Galik

+1

@Galik:彼は 'namespaceof(T):: ToString()'を望んでいるという意味です。つまり、 'Y :: ToString()'や 'Z :: ToString()'などであってもかまいません。だから、 'X :: ToString()'と書くのは正しいことではありません。 –

+0

私が正しいと分かっていれば、 'X :: ToString();'を別のパラメータ型( 'X :: SomeType'と' Y :: SomeType')で呼び出せるように思えます。そのためには、テンプレート関数にする必要があります。 – Galik

答えて

3

[OK]を、私は解決策を持っているかもしれません。異なる名前のクラスの外にある中間関数を追加し、正しい名前で呼び出します。

は、参照がから来ている名前空間にかかわらず、そのうちのX名前空間内の関数を参照する

return ::X::ToString(t); 

を使用する明示的

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); 
    } 
} 
+0

これは妥当と思われます。さて、これは私が「すべてを自由な機能にする」宗教に加入していない理由の1つです。ここの「T」のメンバ関数は、非常に単純で明瞭です。 @ LightightRacesinOrbit。 –

+0

はい私は同意する。 T型は実際にはメソッドを追加できない列挙型であることを説明するのを忘れていました。 –

+0

良いことそれから:) –

2

を追加します。

+1

ええ、そうですが、関数がY名前空間にあるときは、どの名前空間に関係なくX名前空間で関数を呼び出すことはあまり役に立ちません。 –

関連する問題