问题描述
是否有一种无需输入类名即可获取类类型的方法(例如在宏扩展上)?
我希望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> {};