【问题标题】:What is "Class::*"什么是“类::*”
【发布时间】:2026-02-10 03:55:01
【问题描述】:

我正在学习 SFINAE(替换失败不是) 我在一个网站上找到了一个例子,

template<typename T>
class is_class {
   typedef char yes[1];
   typedef char no [2];
   template<typename C> static yes& test(int C::*); // What is C::*?
   template<typename C> static no&  test(...);
   public:
   static bool const value = sizeof(test<T>(0)) == sizeof(yes);
};

我在第 5 行发现了一个新签名 int C::*。起初我以为是 operator*,但我想这不是真的。 请告诉我这是什么。

【问题讨论】:

  • 很抱歉问了类似的问题。我试图用关键字“::*”搜索它,但我找不到它。感谢您让我知道类似问题的链接。

标签: c++


【解决方案1】:

int C::* 是指向 C 类成员的指针,其类型为 int

例子:

struct C
{
   C () : a(0), b(0) {}
   int a;
   int b;
};

int main()
{
   int C::*member1 = &C::a;
   int C::*member2 = &C::b;
   C c1;
   c1.*member1 = 10;  // Sets the value of c1.a to 10
   c1.*member2 = 20;  // Sets the value of c1.b to 20
}

【讨论】:

  • 非常感谢您,R Sahu。这对我来说是新的。请让我问你更多。它是像“this”关键字这样的特殊关键字吗?即使班级没有成员,它是否随时存在?再次非常感谢您。
  • 即使类没有成员,该类型也存在,但不能将其初始化为指向成员。例如,您可以使用float C::*member3 = nullptr;。由于C 没有float 类型的成员,所以member3 不能指向C 的成员。
  • @mora 它不是关键字,它的语言语法,它是一种允许您指定指向类成员的指针的机制。它的特别之处在于它不是指向特定对象成员的指针,而是指向同一类的任何对象的相同成员的指针。老实说,我想不出这种机制有什么实际用途,但如果需要,该语言会提供它。
  • @Havenard,请参阅 this SO answer 了解此语言结构的示例用法。
  • @RSahu 这是一个很好的例子。