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你是什么意思?