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

问题描述

是否有一种无需输入类名即可获取类类型的方法(例如在宏扩展上)?

我希望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;
}
,

您不知道参数的自身类型。

有几种选择,包括:

  • 需要特定的typedef:

    #define SWAP_METHOD() void swap( Self& a1,Self& a2 )
    
    class A {
    public:
        using Self = A; // Require
        SWAP_METHOD();
    };
    
  • 使用CRTP代替MACRO

template <typename Derived>
struct Swappable
{
    static void swap(Derived& d1,Derived& d2) { /*..*/}
};

struct A : Swappable<A> {};