提问者:小点点

检测成员或非成员函数上下文(“this”是否存在)


假设我有一个宏。 有没有方法检测它是在成员函数还是非成员函数上下文中使用的? 即。 指针是否存在? 我尝试使用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来解决的,我将非常感激。


共1个答案

匿名用户

如果:

如果constexpr If语句出现在模板化实体内部,并且If条件在实例化后不依赖于值,则在实例化封闭模板时,不实例化丢弃的语句。

vs

在模板之外,完全检查丢弃的语句。 如果constexpr不是#if预处理指令的替代品:

在您的示例中,您在一个非模板化函数中调用宏及其内部的constexpr if。 因此对不存在的this的访问格式不正确。

此外,由于constexpr if没有访问模板参数,所以SFINAE不会发生,即使这样也会让if子句中的表达式失败。