c++ - 在可变参数宏中找出 __VA_ARGS__ 的类型
问题描述
假设,我有一个可变参数宏(例如,MY_MACRO(...)
),我将其称为以下方式:
MY_MACRO(std::pair<int, int> const &p)
现在,__VA_ARGS__
在我的宏中将是std::pair<int, int> const &p
.
有没有办法确定类型__VA_ARGS__
?
大概,如果像decltype(std::pair<int, int> const &p)
work 和 yield这样的东西,我会很感激std::pair<int, int> const&
,所以在我的可变参数宏的主体decltype(__VA_ARGS__)
中也会 yield std::pair<int, int> const&
。不幸的是,这不起作用。
解决方案
您可以将__VA_ARGS__
其用作 lambda 参数,然后将该 lambda 转换为函数指针并提取参数类型:
template <typename T> struct func_param {};
template <typename T> struct func_param<void(*)(T)> {using type = T;};
#define FOO(...) \
do \
{ \
auto lambda = +[]([[maybe_unused]] __VA_ARGS__) {}; \
using type = func_param<decltype(lambda)>::type; \
/* Do something with `type`. */\
} \
while (0);
推荐阅读
- python - Django Migrate 使用特定的数据库和模型
- sql - 选择在两个不同表上连接的具有两个不同条件的列
- python - SQLAlchemy 如何使用 ORM 重新创建此更新语句
- angular - Angular:为我的库使用全局样式 css:正确的方法?
- python - Snakemake - 将附加参数传递给输入函数
- python - CSH /TCSH 根据其索引遍历变量中的所有元素
- javascript - NAV-LINK - 在重定向之前测试用户输入?
- flutter - Flutter:保存大量数据的最佳方式
- javascript - Safari 从 DOM 分离元素后调用事件处理程序
- node.js - 让管理员应用程序使用某些 api 密钥为另一个应用程序中的用户预订服务