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

标签 c++ c++11

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

下面是我要完成的工作的说明。 假设文件 class_include.h 包含类 A 的定义:

class A
{ 
...
};

或类B:

class B
{ 
...
};

和类 C 试图扩展其中任何一个声明:

#include <class_include.h>

#if (class A is declared)
class C : public A
#else // class B is declared
class C : public B
#endif
{
...
};

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

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

最佳答案

您可以,而且不需要宏。首先观察一下,即使在其完整定义可用之后,您也可以“转发”声明一个类。 IE。这是有效的:

class foo{};
class foo;

现在,借助自制 void_t 实现和 is_complete 类型实用程序,您可以执行以下操作:

#include <type_traits>

template<typename... Ts> struct make_void { typedef void type;};
template<typename... Ts> using void_t = typename make_void<Ts...>::type;

template <typename T, typename Enabler = void>
struct is_complete : std::false_type {};

template <typename T>
struct is_complete<T, ::void_t<decltype(sizeof(T) != 0)>> : std::true_type {};

class A;
class B;

class C : public std::conditional<is_complete<A>::value, A, B>::type {
};

根据 A 的完整定义是否存在,C 将继承自 AB 公开。 See a live example .

但我提醒您,这需要小心处理,否则您的程序很可能会违反 ODR。

关于c++ - 如何检查一个类是否在 C++ 中声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53297795/

相关文章:

c++ get() 不设置eof

c++ - 为什么队列接受 vector 作为其底层容器?

c# - 如何强制 Internet Explorer 打开它当前运行的实例而不是创建一个新实例?

c++ - 如何在 Windows 中的私有(private)管理池中设置线程优先级?

c++ - 如何使用 Vulkan Api 上的暂存缓冲区解决网格损坏问题

c++ - 自动和自动&和常量

c++ - 如何调试罕见的死锁?

c++ - 为什么我的 C++ 正则表达式匹配正确,但没有返回正确的值?

c++ - 请求 ‘c_str’ 中的非类成员 ‘str’

c++ - 在 C++ 中强制执行语句顺序