C++ 如何在类声明中获取类的decltype

C++ 如何在类声明中获取类的decltype,c++,c++11,C++,C++11,有没有一种方法可以在不键入类名的情况下获取类类型(例如宏扩展) 我希望decltype(*this)可以从类声明中获得,但事实并非如此 // For example, I want declare a swap from macro expansion without passing class name on macro argument #define SWAP_METHOD() void swap( decltype(*this)& a1, decltype(*this)&

有没有一种方法可以在不键入类名的情况下获取类类型(例如宏扩展)

我希望
decltype(*this)
可以从类声明中获得,但事实并非如此

// For example, I want declare a swap from macro expansion without passing class name on macro argument
#define SWAP_METHOD()
    void swap( decltype(*this)& a1, decltype(*this)& a2 )

class A
{
    SWAP_METHOD();
}

使用模板元编程的解决方案。我认为这是最简单的解决办法

#include <utility>

#define SWAP_METHOD()     \
  template <typename T>   \
  void swap(T& a1, T& a2)

class A {
 public:
  SWAP_METHOD();
};

template <>
void A::swap(A& a1, A& a2) {
  std::swap(a1, a2);
}

int main() {
  A a, b, c;
  a.swap(b, c);
  return 0;
}
#包括
#定义SWAP_方法()\
模板\
无效掉期(T&a1、T&a2)
甲级{
公众:
SWAP_方法();
};
模板
无效A::交换(A&a1、A&a2){
标准:交换(a1,a2);
}
int main(){
A、b、c;
a、 互换(b,c);
返回0;
}

使用模板元编程的解决方案。我认为这是最简单的解决办法

#include <utility>

#define SWAP_METHOD()     \
  template <typename T>   \
  void swap(T& a1, T& a2)

class A {
 public:
  SWAP_METHOD();
};

template <>
void A::swap(A& a1, A& a2) {
  std::swap(a1, a2);
}

int main() {
  A a, b, c;
  a.swap(b, c);
  return 0;
}
#包括
#定义SWAP_方法()\
模板\
无效掉期(T&a1、T&a2)
甲级{
公众:
SWAP_方法();
};
模板
无效A::交换(A&a1、A&a2){
标准:交换(a1,a2);
}
int main(){
A、b、c;
a、 互换(b,c);
返回0;
}

您无法知道参数的自身类型

有几种备选方案,包括:

  • 需要特定的typedef:

    #define SWAP_METHOD() void swap( Self& a1, Self& a2 )
    
    class A {
    public:
        using Self = A; // Require
        SWAP_METHOD();
    };
    
  • 使用CRTP而不是宏

模板
结构可交换
{
静态无效交换(派生和d1、派生和d2){/*../}
};
结构A:可交换{};

您无法知道参数的自身类型

有几种备选方案,包括:

  • 需要特定的typedef:

    #define SWAP_METHOD() void swap( Self& a1, Self& a2 )
    
    class A {
    public:
        using Self = A; // Require
        SWAP_METHOD();
    };
    
  • 使用CRTP而不是宏

模板
结构可交换
{
静态无效交换(派生和d1、派生和d2){/*../}
};
结构A:可交换{};

您收到了什么错误?宏在编译发生之前的翻译阶段4进行了扩展,因此您的错误是
“错误:在顶层使用'this'无效”
?“,但[
decltype(*this)
可从类声明中获得]”——这是一个不精确的结论;看见
指针在非静态成员函数的声明中可用,但仅在可选cv限定符序列之后可用,该序列恰好位于参数列表之后。(不过,在您的案例中没有实际的区别。)更准确的说法是“我希望
decltype(*this)
在成员函数参数列表声明中可用,但事实并非如此。”如果要模板化交换方法,为什么要在类本身中定义它?您收到了什么错误?宏在编译发生之前的翻译阶段4进行了扩展,因此您的错误是
“错误:在顶层使用'this'无效”
?“,但[
decltype(*this)
可从类声明中获得]”——这是一个不精确的结论;看见
指针在非静态成员函数的声明中可用,但仅在可选cv限定符序列之后可用,该序列恰好位于参数列表之后。(不过在您的案例中没有实际的区别。)更准确的说法是“我希望
decltype(*this)
在成员函数参数列表声明中可用,但事实并非如此。”如果您想模板化交换方法,为什么要在类本身中定义它?是的,这可以通过
(我还没有太多地使用过…
:)
来实现,但是有很多声明函数没有实现…@IsaacPascual你是什么意思?是的,这可以通过
(我还没有太多地使用过…
:)
但是有很多声明的函数没有实现…@IsaacPascual你是什么意思?