相关疑难解决方法(0)

转发在C++中声明一个枚举

我正在尝试做类似以下的事情:

enum E;

void Foo(E e);

enum E {A, B, C};
Run Code Online (Sandbox Code Playgroud)

编译器拒绝的.我已经快速浏览了一下Google,而且共识似乎是"你做不到",但我无法理解为什么.谁能解释一下?

澄清2:我这样做是因为我在类中使用私有方法来获取枚举,并且我不希望枚举枚举值 - 例如,我不希望任何人知道E被定义为

enum E {
    FUNCTIONALITY_NORMAL, FUNCTIONALITY_RESTRICTED, FUNCTIONALITY_FOR_PROJECT_X
}
Run Code Online (Sandbox Code Playgroud)

因为项目X不是我希望用户了解的东西.

所以,我想转发声明枚举,以便我可以将私有方法放在头文件中,在cpp内部声明枚举,并将构建的库文件和标题分发给人.

至于编译器 - 它是GCC.

c++ enums

257
推荐指数
8
解决办法
18万
查看次数

如何使用SFINAE检测一个类的存在?

是否可以使用SFINAE检测C++中是否存在类?如果可能的话怎么样?

假设我们有一个只由某些版本的库提供的类.我想知道是否可以使用SFINAE来检测该类是否存在.检测结果是任意的,比如枚举常数,如果存在,则为1,否则为0.

c++ templates sfinae

27
推荐指数
3
解决办法
7935
查看次数

如何检查是否在C++中声明了一个类?

我正在围绕一个框架编写一个软件,我正在使用的一个类(准确地说,扩展)在更高版本中重命名.有没有办法在C++ 11中编写一些宏/模板,以确定是否在代码中声明了具有某个名称的类?

我想要完成的一个例子如下.假设文件class_include.h包含类的定义A:

class A
{ 
...
};
Run Code Online (Sandbox Code Playgroud)

或者班级B:

class B
{ 
...
};
Run Code Online (Sandbox Code Playgroud)

和类C尝试扩展声明的那些:

#include <class_include.h>

#if (class A is declared)
class C : public A
#else // class B is declared
class C : public B
#endif
{
...
};
Run Code Online (Sandbox Code Playgroud)

注意:我想到尝试检查框架的一个版本,但这个问题的答案让我感兴趣.我也无法更改任何框架头文件.

编辑:接受的答案取决于是否定义了类(这意味着声明),在我的情况下,如果定义了类,则声明该类.

c++ c++11

14
推荐指数
3
解决办法
385
查看次数

标签 统计

c++ ×3

c++11 ×1

enums ×1

sfinae ×1

templates ×1