条件(SFINAE)覆盖
conditional (SFINAE) override
我正在尝试这样做:
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>
,一个版本的条件为true(enable_if
版本),另一个版本为false(默认版本)。
如果您希望能够重用默认的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; }
};
我们继承了"true"案例中的"false"案例。但这对我来说有点脏——我宁愿把通用实现放在第三个位置(B_impl
),而不是那个黑客。(在B
的第一种情况下,这也允许您静态断言第二个参数是void
)。
相关文章:
- 为什么使用SFINAE而不是函数重载
- 使用ios:ate写入到流会覆盖现有文件
- 如何使用模板函数的函数签名进行SFINAE
- 数据成员SFINAE的C++17测试:gcc vs clang
- 使用在用于SFINAE的void_t中具有参数的方法
- 我可以重新分配/覆盖std::字符串吗
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 叮叮当当在修复时插入多个"覆盖"说明符
- 谷歌模拟和覆盖关键字
- 提供与TMP和SFINAE的通用接口
- "Inverse SFINAE"避免模棱两可的过载
- TMap::Emplace() 在应用现有密钥时会覆盖吗?
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 使用子类覆盖基类中定义的函数
- 当覆盖存在时调用基本虚拟"binded to object"函数
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- C++指针在 for 循环中被覆盖
- 如何在儿童类中使用SFINAE
- 可扩展的 SFINAE 条件覆盖
- 条件(SFINAE)覆盖