微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在类声明中获取类的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> {};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。