我正在围绕一个框架编写一个软件,而我正在使用的一个类(准确地说,是扩展的)在以后的版本中被重命名。有没有办法在 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
将继承自 A
或 B
公开。 See a live example .
但我提醒您,这需要小心处理,否则您的程序很可能会违反 ODR。
关于c++ - 如何检查一个类是否在 C++ 中声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53297795/