我正在尝试这样做:
struct A
{
virtual int f() const { return 0; }
};
template <typename T>
struct B : A
{
template <typename U = T,
typename std::enable_if<...some condition involving U...>::type>
int f() const { return 1; }
};
注意,我不能继承类模板(使用静态覆盖)。这种构造是否允许,模板成员 B::f() 是否可以覆盖成员 A::f()?
最佳答案
试试这个:
template <typename T, typename=void>
struct B : A
{
...
};
temlate <typename T>
struct B<T, typename std::enable_if<...some condition...>::type>:
A
{
virtual int f() const override { return 1; }
};
我们有两个版本的 B<T>
,一个条件为真(enable_if
),一个条件为假(默认)。
如果您希望能够重用您的默认 B
实现,你甚至可以这样做:
template <typename T, typename=void>
struct B : A
{
...
};
template <typename T>
struct B<T, typename std::enable_if<...some condition...>::type>:
B<T, bool>
{
virtual int f() const override { return 1; }
};
我们从“真”案例中的“假”案例继承。但这对我来说有点脏——我宁愿将通用实现放在第三个位置 ( B_impl
) 而不是那个 hack。 (这也让你静态断言第二个参数是 void
在第一种情况下 B
)。
关于c++ - 条件 (SFINAE) 覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14843900/