gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:33:17 25 4
gpt4 key购买 nike

我正在围绕一个框架编写一个软件,而我正在使用的一个类(准确地说,是扩展的)在以后的版本中被重命名。有没有办法在 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/

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