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++有反射??所以您想确保struct
example
没有名为
bad_name
的成员?如果使用
静态断言
可以,您可以在
示例中添加一个
\define bad\u-name-instructed-name
。h
您想要什么类型的“受限标识符”?
static_assert(!has_bad_name<example>::value, "");