Скрытие функций-членов в шаблонном классе

Можно ли скрыть некоторые функции-члены в классе шаблона? Представим, что у нас есть что-то вроде:

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>

Однако компилятор не позволяет мне это сделать. Есть ли другой способ сделать это возможным? Будет ли это работать, если функция-член на самом деле является конструктором?

7
задан Erik 20 April 2011 в 19:16
поделиться