假设我有一个宏。 有没有方法检测它是在成员函数还是非成员函数上下文中使用的? 即。 此
指针是否存在? 我尝试使用constexpr if
,但无法消除错误在非成员函数中无效使用“this”
:
#include <typeinfo>
#include <type_traits>
#define macro(a, b, c) \
do { \
const char* class_name; \
if constexpr (std::is_class<decltype(*this)>::value) \
class_name = typeid(*this).name(); \
else \
class_name = ""; \
} while (0)
struct foo {
void member () {
macro(1, 2, 3);
}
};
void non_member() {
macro(4, 5, 6);
}
如果能看到这个问题是如何用C++14(因为我与它绑定)和C++20来解决的,我将非常感激。
如果:
如果constexpr If语句出现在模板化实体内部,并且If条件在实例化后不依赖于值,则在实例化封闭模板时,不实例化丢弃的语句。
vs
在模板之外,完全检查丢弃的语句。 如果constexpr不是#if预处理指令的替代品:
在您的示例中,您在一个非模板化函数中调用宏及其内部的constexpr if
。 因此对不存在的this
的访问格式不正确。
此外,由于constexpr if
没有访问模板参数,所以SFINAE不会发生,即使这样也会让if子句中的表达式失败。