C++ 如果存在具有特定名称的结构成员,则强制编译失败
假设C++ 如果存在具有特定名称的结构成员,则强制编译失败,c++,C++,假设bad\u name是一个受限标识符,例如我不想成为结构的一部分。在这种情况下,我正在寻找一种强制编译失败的机制 例h struct example { int okay_name; int bad_name; } main.cc #include "example.h" int main() { example ex; // cause compilation to fail here if bad_name is a member of ex return 0
bad\u name
是一个受限标识符,例如我不想成为结构的一部分。在这种情况下,我正在寻找一种强制编译失败的机制
例h
struct example {
int okay_name;
int bad_name;
}
main.cc
#include "example.h"
int main() {
example ex;
// cause compilation to fail here if bad_name is a member of ex
return 0;
}
有可能通过模拟反射在运行时导致失败,但有没有办法在编译时执行此操作?您可以将
坏名称定义为会导致编译时错误的东西。例如,无:
#define bad_name
在GCC上给出
错误:声明未声明任何内容[-fppermissive]
int坏名字
您可以像这样在C中模拟静态断言:
#define bad_name xxx; char static_assertion_bad_name_used[-1];
struct example {
int okay_name;
int bad_name;
};
GCC中给出了:
main.c:6: error: size of array ‘static_assertion_bad_name_used’ is negative
这种技术的优点是,错误消息会提醒您问题所在(即使有点模糊)
更新阅读后,我发现如果数组大小为负数,MS Visual Studio在错误消息中不包含实际变量名。这里有一个替代方案:
#define bad_name xxx; int static_assertion_bad_name_used : 0;
GCC中的错误消息是:
main.c:5: error: zero width for bit-field ‘static_assertion_bad_name_used’
很明显,在VS
此外,如果使用一个更先进的编译器,你可以使用,这将是一个干净得多
假设bad_name是一个受限标识符,例如,我没有
希望成为结构的一部分。我正在寻找一种机制来强制
在这种情况下,编译失败
这不是完全可移植的,但至少在VC++和GCC中,您可以将标识符标记为,并且如果需要,可以将它给出的警告提升为错误。您可以使用以下方法:
#include <cstdint>
#define DEFINE_HAS_SIGNATURE(traitsName, funcName, signature) \
template <typename U> \
class traitsName \
{ \
private: \
template<typename T, T> struct helper; \
template<typename T> \
static std::uint8_t check(helper<signature, &funcName>*); \
template<typename T> static std::uint16_t check(...); \
public: \
static \
constexpr bool value = sizeof(check<U>(0)) == sizeof(std::uint8_t); \
}
DEFINE_HAS_SIGNATURE(has_bad_name, T::bad_name, decltype(&T::bad_name));
C++有反射??所以您想确保structexample
没有名为bad_name
的成员?如果使用静态断言
可以,您可以在示例中添加一个\define bad\u-name-instructed-name
。h
您想要什么类型的“受限标识符”?
static_assert(!has_bad_name<example>::value, "");