テンプレート クラスを作成していて、特定のテンプレート タイプに対してのみ追加のメソッドが存在できるようにしたいと考えています。現在、このメソッドはすべてのテンプレート タイプに存在しますが、他のすべてのタイプではコンパイル エラーが発生します。
これを複雑にしているのは、それがオーバーロードされた operator() であることです。私がやりたいことが実際にここで可能かどうかはわかりません。
これが私が今持っているものです:
template<typename T, typename BASE>
class MyClass : public BASE
{
public:
typename T& operator() (const Utility1<BASE>& foo);
typename T const& operator() (const Utility2<BASE>& foo) const;
};
T&
バージョンを常に利用できるようにしたいのですが、T const&
バージョンが有効な場合にのみ利用できUtility2<BASE>
ます。現在、両方の方法が存在しますが、const バージョンを使用しようとすると、Utility2<BASE>
無効な場合に奇妙なコンパイル エラーが発生します。賢明なエラー、または「そのようなメンバー関数はありません」というエラーが発生することをお勧めします。
これは可能ですか?
編集:ブーストドキュメントを読んだ後、ここに私が思いついたものがありますが、うまくいくようです:
template<typename T, typename BASE>
class MyClass : public BASE
{
public:
typename T& operator() (const Utility1<BASE>& foo);
template<typename U>
typename boost::enable_if<boost::is_same<Utility2<BASE>, U>, T>::type const &
operator() (const U& foo) const;
};
そのため、誰かが Utility2 で使用しようとしない限り、そのメソッドは存在せず、その BASE タイプに対して有効な場合にのみ Utility2 を作成できます。ただし、その BASE 型に対して有効でない場合、MyClass はアクセサー メソッドの作成に時間を浪費しません。