我正在尝试这样做:
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()吗?
发布于 2013-02-13 07:43:38
试试这个:
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),而不是那个地方。(这还允许您静态断言第二个参数在第一个B情况下为void )。
https://stackoverflow.com/questions/14843900
复制相似问题