Можно ли скрыть некоторые функции-члены в классе шаблона? Представим, что у нас есть что-то вроде:
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>
Однако компилятор не позволяет мне это сделать. Есть ли другой способ сделать это возможным? Будет ли это работать, если функция-член на самом деле является конструктором?