MST

星途 面试题库

面试题:C++类成员指针与模板元编程结合

利用C++类成员指针和模板元编程技术,实现一个编译期断言,当类中不存在指定类型的成员变量时,编译失败。请详细说明实现原理并给出完整代码。
24.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

实现原理

  1. 类成员指针:通过获取类成员变量的指针,若能获取成功,说明类中存在该成员变量,否则不存在。
  2. 模板元编程:利用模板特化和SFINAE(Substitution Failure Is Not An Error)原则。在编译期根据模板参数进行条件判断,如果模板实例化失败,不视为错误,从而实现编译期断言。

完整代码

#include <type_traits>

// 辅助模板,用于判断类中是否存在指定类型的成员变量
template <typename Class, typename MemberType, MemberType Class::*member>
struct has_member_variable {
    static constexpr bool value = true;
};

template <typename Class, typename MemberType>
struct has_member_variable<Class, MemberType, nullptr> {
    static constexpr bool value = false;
};

// 编译期断言模板
template <typename Class, typename MemberType>
struct compile_time_assert_has_member {
    static_assert(has_member_variable<Class, MemberType, nullptr>::value, "Class does not have the specified member variable.");
};

// 示例类
class MyClass {
public:
    int member;
};

int main() {
    // 测试编译期断言
    compile_time_assert_has_member<MyClass, int>(); 
    // 这里不会触发断言,因为MyClass有int类型的成员变量

    // 如果尝试对没有指定成员变量的类进行断言,编译会失败
    // compile_time_assert_has_member<MyClass, double>(); 
    // 会触发断言,因为MyClass没有double类型的成员变量

    return 0;
}