隐藏模板类中的成员函数

Mar*_*rda 7 c++ templates hide sfinae

是否可以在模板类中隐藏一些成员函数?让我们想象我们有类似的东西:

template <class T>
class Increment
{
public:
    void init(T initValue)
    {
         mValue = initValue;
    }  

    T increment()
    {
        ++mValue;
    }

    T increment(T delta)
    {
        mValue += delta;
    }
private:
    T mValue;
};
Run Code Online (Sandbox Code Playgroud)

目标是使用这个类,在某些情况下我们只看到increment()函数,在其他情况下我们只看到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;
}
Run Code Online (Sandbox Code Playgroud)

然后使用我的模板,例如:

Increment<long, MultipleIncrement>
Run Code Online (Sandbox Code Playgroud)

但是,编译器不允许我这样做.还有其他方法可行吗?如果成员函数实际上是构造函数,它也会工作吗?

evn*_*vnu 3

在这种情况下,我更喜欢使用模板专业化。这样的事情会对你有帮助吗?

struct SingleIncrement;
struct MultipleIncrement;

template <
    class T, 
    class Policy = SingleIncrement // default template param
>
class Increment
{
    T mValue;
public:
    Increment(T initValue)
    :   mValue(initValue)
    {}

    T increment()
    {
        ++mValue;
    }
};

// template specialization for MultipleIncrement
template <class T>
class Increment<T,MultipleIncrement>
{
    T mValue;
public:
    Increment(T initValue)
    :   mValue(initValue)
    {}

    T increment(T delta)
    {
        mValue += delta;
    }
};
Run Code Online (Sandbox Code Playgroud)