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)
但是,编译器不允许我这样做.还有其他方法可行吗?如果成员函数实际上是构造函数,它也会工作吗?
在这种情况下,我更喜欢使用模板专业化。这样的事情会对你有帮助吗?
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)
| 归档时间: |
|
| 查看次数: |
1230 次 |
| 最近记录: |