テンプレート クラスで一部のメンバー関数を非表示にすることは可能ですか? 次のようなものがあるとしましょう。
template <class T>
class Increment
{
public:
void init(T initValue)
{
mValue = initValue;
}
T increment()
{
++mValue;
}
T increment(T delta)
{
mValue += delta;
}
private:
T mValue;
};
目的は、特定のケースでは increment() 関数のみが表示され、他のケースではインクリメント(T) メンバー関数のみが表示されるように、このクラスを使用することです。そのために、SFINAE で何かを考えることができます。
class MultipleIncrement
{
typedef int MultipleIncrement_t;
};
class SingleIncrement
{
typedef int SingleIncrement_t;
};
template <class T, class Q>
class Increment
{
public:
void init(T initValue)
{
mValue = initValue;
}
T increment(typename Q::SingleIncrement_t = 0)
{
++mValue;
}
T increment(T delta, typename Q::MultipleIncrement_t = 0)
{
mValue += delta;
}
private:
T mValue;
}
次に、たとえば次のようにテンプレートを使用します。
Increment<long, MultipleIncrement>
ただし、コンパイラはこれを許可していません。これが実現可能な他の方法はありますか?メンバー関数が実際にコンストラクターである場合にも機能しますか?