繁体   English   中英

如何检测C ++ 11中的类是否是最终的?

[英]How to detect if a class is final in C++11?

代码优先。

#include <iostream>

using namespace std;

struct A final {};
struct B {};

int main()
{ 
    cout << is_final<A>::value << endl; // Output true
    cout << is_final<B>::value << endl; // Output false

    return 0; 
}

如何实现类is_final?

作为GCC的__is_final intrinisic(对于PR 51365 )的实现者,我很确定它不能在库中完成,它需要编译器支持。

您可以使用C ++ 11的SFINAE表达式功能做一些非常聪明的事情,但要检测一个类是否是最终需要从中派生出来,并在模板参数推导上下文中实例化派生类型,但是派生自class是在声明而不是表达式中完成的。

此外,您应该考虑是否只想知道是否使用了final伪关键字,或者是否由于其他原因(例如只有私有构造函数)而导致类无法派生。

类型特征通常使用SFINAE惯用法实现,该习惯用法在函数模板声明中放置了可能不正确的表达式。 将有问题的typename替换为声明会导致错误,但错误在该上下文中被抑制,因此声明是否使用。 但是后备过载会备份可能缺失的声明。 另一部分代码访问该函数以检测敏感过载或仅实例化备份。

这不适用于final因为它只能在类的模板实例化期间导致失败。 没有办法重载类,也没办法暂时定义一个失败的类,但是如果它是从final派生的,则不会停止编译。

标准引用,C ++11§14.8.2/ 8:

只有函数类型的直接上下文中的无效类型和表达式及其模板参数类型才会导致演绎失败。 [注意:对替换类型和表达式的评估可能会导致副作用,例如类模板特化和/或函数模板特化的实例化,隐式定义函数的生成等。这些副作用不在“立即上下文“并且可能导致程序格式不正确。 - 结束说明]

不确定这是否是你想要的,但你可以这样做:

#include <iostream>

struct Foo {};
struct Bar {};

template<typename T>
struct is_final {
    static const bool value = false;
};
template<>
struct is_final<Bar> {
    static const bool value = true;
};


int main(void) {
    std::cout << is_final<Foo>::value << std::endl;
    std::cout << is_final<Bar>::value << std::endl;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM