如何在 C++ 中检查声明的标识符?

Art*_*oul 5 c++ reflection variables declaration function

我想在代码的某个点检查是否x声明了某个标识符,我该怎么做?

我需要对不同类型的标识符进行这种检查 - 变量、枚举常量、函数、类型、宏等。但首先我想至少检查变量和函数。

我需要这样的检查(例如虚数declared(x)),以便下一个代码适用于 int 变量的情况x

if constexpr(declared(x)) {
    int y = x + 1;
} else {
    std::cout << "Variable 'x' not declared!" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

对于原因宏的情况,我可以使用#ifdef x,但是如何对变量/函数进行相同的检查?

对于全局非 lambda 函数的情况,我根据重载函数解析计算出了下一个代码,但它需要使用基于辅助宏的全局定义(可以进一步简化吗?):

在线尝试一下!

#include <iostream>
#include <type_traits>

#define declared_func_helper(x, ...) \
    struct NotDeclared; \
    template <typename ... Args> \
    NotDeclared x(Args ...); \
    template <typename ... Args> \
    inline constexpr bool declared_func_##x(Args && ... args) { \
        return !std::is_same_v<decltype(x(args...)), NotDeclared>; \
    }

// declare some of functions
//void f(int a) {}
void g(bool b, char c) {}
    
// define helpers before or after declared functions
declared_func_helper(f);
declared_func_helper(g);

int main() {
    // check declaration of functions
    std::cout << "func 'f' declared: " << std::boolalpha << declared_func_f(int()) << std::endl;
    std::cout << "func 'g' declared: " << std::boolalpha << declared_func_g(bool(), char()) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

其输出:

func 'f' declared: false
func 'g' declared: true
Run Code Online (Sandbox Code Playgroud)

对于非全局变量的情况,我实现了下一个代码,但它还需要通过宏定义助手:

在线尝试一下!

#include <type_traits>
#include <iostream>

#define declared_var_helper(x) \
    struct NotDeclared_##x {}; \
    NotDeclared_##x x;
#define declared_var(x) \
    ([&](){ return !std::is_same_v<decltype(x), NotDeclared_##x>; }())
    
// use helpers before variables declaration
declared_var_helper(x);
declared_var_helper(y);

int main() {
    // declare some of variables
    //bool x = false;
    int y = 0;
    // ........
    // later check declaration
    constexpr bool is_declared_x = declared_var(x), is_declared_y = declared_var(y);
    std::cout << std::boolalpha << "var 'x' declared: " << is_declared_x << std::endl;
    std::cout << "var 'y' declared: " << is_declared_y << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

其输出:

var 'x' declared: false
var 'y' declared: true
Run Code Online (Sandbox Code Playgroud)

其他情况怎么样,或者更简单的检查方法?

小智 0

对于函数问题,您可以做的是声明一个全局函数指针,您的客户端必须填写该指针,并且默认情况下将其设置为您的函数。

例如:

const auto Function = Function_Fallback
Run Code Online (Sandbox Code Playgroud)

然后Function到处使用。