c++ - 在模板类中隐藏成员函数

标签 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;
};

目标是以某种方式使用这个类,在某些情况下 我们只看到 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;
}

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

Increment<long, MultipleIncrement>

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

最佳答案

在这种情况下,我更愿意使用模板特化。这样的事情对您有帮助吗?

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;
    }
};

关于c++ - 在模板类中隐藏成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5735412/

相关文章:

C++ 查找数组中的最大数

c++ - 分配后我必须在哪里释放内存?

c++ - 如何在加载的样本上使用 FFTW?

C++模板问题

javascript - 动画不透明度隐藏/显示

c++ - 错误 : has initializer but incomplete type

c++ - 为什么这个 sfinae 不起作用?

c++ - 显式实例化失败的原因是什么?

image - 使用 .htaccess 隐藏未找到图像十字标记

jquery - 自动 jquery 效果(不需要)