gpt4 book ai didi

c++ - 在运行时检查我是否可以实例化(抽象)类

转载 作者:行者123 更新时间:2023-11-28 02:12:36 25 4
gpt4 key购买 nike

假设我有:

class A:
{
public:
A();
virtual void foo();
};

class B:public A
{
public:
B();
void foo();
};

class C:public A
{
public:
C();
void foo();
};

主要是

if(is_abstract<A>::value==false)
{
int option;
cout<<"What type of object do you want to create? 0-A,1-B,2-C";
cin option;
if(option==0)
A *a = new A();
if(option==1)
B *b = new B();
else
C *c = new C();
}
else
{
int option;
cout<<"What type of object do you want to create? 1-B,2-C";
cin option;
if(option==1)
B *b = new B();
else
C *c = new C();
}

在当前状态下,代码可以工作。如果我使 virtual void foo()=0,A 变成抽象类并且我得到编译时错误,因为我不能在 A *a = new A() 处实例化抽象类。有没有办法绕过这个编译时错误?谢谢

最佳答案

在当前形式中,将生成尝试实例化 A 的代码(尽管从未调用)。即使编译器由于优化而不会生成代码,非生成的代码仍然必须是有效的,而你的不是。

要解决此问题,您必须使用某种形式的 SFINAE 来确保永远不会生成尝试实例化 A 的代码。像这样:

void make(std::enable_if_t<std::is_abstract<A>::value>* = nullptr) {
... (the code which never creates A)
}

void make(std::enable_if_t<!std::is_abstract<A>::value>* = nullptr) {
... (the code which does create A)
}

...
make();

关于c++ - 在运行时检查我是否可以实例化(抽象)类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35141095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com