- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想自己做typeid
使用宏。例如如果我调用MY_TYPEID(token)
我希望它解决
my_type_info<token>()
如果它是一个类型,并且
my_type_info(token)
如果它是一个值。
在 C++ 中有什么方法可以做到这一点吗?
最佳答案
这……很艰难。
这是完成的宏:
#define MY_TYPEID(...) \
[&](auto...) { \
\
auto &&thing(__VA_ARGS__); \
auto probe = [](auto...) -> decltype(thing, void()) {}; \
\
if constexpr(detail_type_info::wizz(probe)) \
return detail_type_info::my_type_info( \
std::forward<decltype(thing)>(thing) \
); \
else \
return detail_type_info::my_type_info< \
my_decltype(__VA_ARGS__) \
>(); \
}()
这个...看起来很有趣的小发明依赖于与 this other answer of mine 相同的基本原理: thing
是转发引用还是函数声明,具体取决于参数是表达式还是类型。
thing
的情况是一个引用很简单(编辑):它最终将作为转发参数到 my_type_info
它将从那里拾取它。
thing
的情况是一个有趣的函数:它有一个推导的返回类型,但还没有(也不会)定义。因此,在提供定义之前不可能使用它。这种“使用”包括琐碎的使用,例如普通的 thing;
: 只是试图将其放入表达式中会使程序格式错误。
这个特征是通过一层SFINAE检测到的:probe
是一个通用的 lambda,其返回类型使用 thing
.但是因为它是通用的,所以在我们调用 lambda 之前它实际上并没有爆炸。这正是detail_type_info::wizz
尝试做:
namespace detail_type_info {
template <class F>
constexpr auto wizz(F probe) -> decltype(probe(), true) { return true; }
constexpr auto wizz(... ) -> decltype( false) { return false; }
}
detail_type_info::wizz(probe)
尝试匹配这些重载之一。第一个重载尝试调用 probe
在未评估的上下文中,实例化 probe
(lambda)的调用运营商。如果thing
实际上,在等待推断其返回类型时,这个实例化失败了,整个重载都被 SFINAE 消除了。第二个重载没有这样的事情,并且始终有效但由于 ...
而从未被优先考虑.
所以我们现在有办法通过detail_type_info::wizz(probe)
来判断, 宏的参数是类型 ( false
) 还是表达式 ( true
)。这是由 if constexpr
开启的,通过将最外层的 lambda 设为模板使其有效。
还有最后一关:detail_type_info::my_type_info(std::forward<decltype(thing)>(thing))
在true
分支始终有效(即使在 thing
是函数声明的情况下实例化它会中断)。
false
然而,分支不能以天真的方式被称为 return detail_type_info::my_type_info<__VA_ARGS__>()
,因为当 __VA_ARGS__
时这会变成废话是一个不是有效非类型模板参数的表达式(例如 double
),在这种情况下,编译器会立即报错。
这就是我重用 another of my answers 的原因我在哪里实现 my_decltype
,即 decltype
在表达式上和类型上的无操作,因此始终形成有效的函数调用。
所有这些机器都已到位,并增加了两个 my_type_info
stub ,以下内容:
namespace detail_type_info {
template <class T>
void my_type_info(T &&) {
std::cout << __PRETTY_FUNCTION__ << '\n';
}
template <class T>
void my_type_info() {
std::cout << __PRETTY_FUNCTION__ << '\n';
}
}
int main() {
MY_TYPEID(int);
MY_TYPEID(4.2);
}
...按预期输出:
void detail_type_info::my_type_info() [with T = int]
void detail_type_info::my_type_info(T&&) [with T = double]
完整代码:
namespace detail_typeOrName {
struct probe {
template <class T>
operator T() const;
};
template <class T>
T operator * (T const &, probe);
probe operator *(probe);
}
#define my_decltype(x) decltype((x) * detail_typeOrName::probe{})
namespace detail_type_info {
template <class T>
void my_type_info(T &&) {
std::cout << __PRETTY_FUNCTION__ << '\n';
}
template <class T>
void my_type_info() {
std::cout << __PRETTY_FUNCTION__ << '\n';
}
template <class F>
constexpr auto wizz(F probe) -> decltype(probe(), true) { return true; }
constexpr auto wizz(... ) -> decltype( false) { return false; }
}
#define MY_TYPEID(...) \
[&](auto...) { \
\
auto &&thing(__VA_ARGS__); \
auto probe = [](auto...) -> decltype(thing, void()) {}; \
\
if constexpr(detail_type_info::wizz(probe)) \
return detail_type_info::my_type_info( \
std::forward<decltype(thing)>(thing) \
); \
else \
return detail_type_info::my_type_info< \
my_decltype(__VA_ARGS__) \
>(); \
}()
关于c++ - 确定是否传递了类型的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50242013/
我正在使用 Selenium Web 驱动程序 3.0,并且想要从打开的两个对话框(一个在后台,第二个在前台)的 Activity 对话框中单击“确定”按钮。如何从 html 下面的父 div 单击前
actions: [ FlatButton( onPressed: () {
我有一个问题有点超出我的范围(我真的很高兴我是 Beta)涉及重复项(所以 GROUP BY, HAVING, COUNT),通过将解决方案保留在 SQLite 附带的标准函数中而变得更加复杂。我正在
使用DBI是否可以确定SELECT语句的已执行语句句柄是否返回任何行而不从中获取行? IE。就像是: use DBI; ... my $sth = $dbh->prepare("SELECT ..."
是否可以为“确定”和“关闭”按钮指定回调函数? 如果是JQuery Modal,则可以在初始化时使用按钮字典指定回调函数。 Semantic-ui模态是否提供类似的功能?按下确定后,我该如何寻求其他逻
我想阅读警报中的消息。 示例:如果警报显示“错误的电子邮件地址”。怎么读呢?意味着我想将该消息存储在字符串中。 如何在“警报”中单击“确定”...?? 如何使用 Selenium 来做到这一点? 最佳
我有一个删除按钮: 我试图首先查明是否已选择一个网站,如果已选择一个网站,我需要确定是否已选择一个或多个列表项,如果是,则继续删除这些项目。 我的 if 语句不断返回“您必须首先选择您的列表”,即使它
部分出于好奇——我们想知道在我们的应用程序中发生了什么——部分是因为我们需要在我们的代码中找到一些潜在的问题,我喜欢在我们的网络应用程序运行时跟踪一些一般值。这尤其包括某些对象图的分配内存。 我们的应
我将 SweetAlert 与 Symfony 结合使用,我希望用户在完成删除操作之前进行确认。 发生的情况是,当用户单击删除按钮时,SweetAlert 会弹出,然后立即消失,并且该项目被删除。 在
我们有一个应用程序可以生成不包括字母 O 的随机基数 35 [0-9A-Z]。我正在寻找一种解决方案来查找包含任何淫秽英语单词的代码,而无需搜索包含 10,000 个条目的列表每个生成的代码。每秒生成
这是我做的: #include #include int betweenArray(int a, int b){ int *arr,i,range; range = b - a +
我知道如何创建 警报和确认框,但我不知道如何做的是实际单击“确定”。我有一个弹出确认框的页面。 我想使用 Java Script 插件单击“确定”。基本上,我希望我的代码单击页面上的链接,然后在出现提
代码: swal('Your ORDER has been placed Successfully!!!'); window.location="index.php"; 甜蜜警报工
>>> import re >>> s = "These are the words in a sentence" >>> regex = re.compile('are|words') >>> [m
使用确定的理想散列函数给出随机期望线性时间算法两个数组 A[1..n] 和 B[1..n] 是否不相交,即 A 的元素是否也是 B 的元素。 谁能告诉我如何做到这一点,甚至如何开始考虑它? 最佳答案
我在计算机科学课上有这段代码: int input=15; while (input < n ) { input = input *3;} 这段代码有 log3(n/15) 次循环的上限。我们怎样才能
我有一个允许 2 位玩家玩 TicTacToe 的程序。在每个玩家移动之后,它应该在那个点显示棋盘并返回一个名为 Status 的枚举,显示玩家是否应该继续,如果玩家赢了,还是平局。但是,该算法要么返
给定一个 y 值数组,例如 [-3400, -1000, 500, 1200, 3790],我如何确定“好的”Y 轴标签并将它们放置在网格上? ^ ---(6,000)-|---
假设我有一个检查用户登录的 SQL 语句: SELECT * FROM users WHERE username='test@example.com', password='abc123', expi
teradata中有返回表中哪一列被定义为主索引的命令吗?我没有制作一些我正在处理的表,也没有尝试优化我对这些表的连接。谢谢! 最佳答案 有dbc.IndicesV,其中IndexNumber=1表示
我是一名优秀的程序员,十分优秀!