首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件(SFINAE)覆盖

条件(SFINAE)覆盖
EN

Stack Overflow用户
提问于 2013-02-13 07:35:25
回答 1查看 923关注 0票数 8

我正在尝试这样做:

代码语言:javascript
复制
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()吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-13 07:43:38

试试这个:

代码语言:javascript
复制
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实现,您甚至可以这样做:

代码语言:javascript
复制
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 )。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14843900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档