我正在尝试这样做:
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()?
答案 0 :(得分:7)
试试这个:
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
一个),一个条件为假(默认值为1)。
如果您希望能够重复使用默认的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
)而不是那个黑客。 (这也让你静态断言第一个void
中的第二个参数是B
。