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
到处使用。