我正在尝试编写一个可以在thiscall和cdecl调用约定中使用的健壮宏,但是如果'this'存在(thiscall),则使用'this'作为附加信息。
有可能吗?
以下是一个不起作用的示例:
#define PRINT_IF_THIS_EXISTS \
if (this) printf("this (addr %08x) exists in %s!\n", size_t(this), __FUNCTION__)
struct MyStruct
{
void MyFunc()
{
PRINT_IF_THIS_EXISTS;
}
};
void StaticFunc()
{
PRINT_IF_THIS_EXISTS;
MyStruct ms;
ms.MyFunc();
}
所需的运行时输出:
这个(地址0015f330)存在于MyStruct :: MyFunc!
中
观察到编译器错误:
Example.cpp(14):错误C2355:'this':只能在非静态成员函数中引用
我正在使用clang和Visual Studio,并且单独使用它仍然有用。这看起来与SFINAE类似,但我没有找到任何与'this'相关的内容
答案 0 :(得分:0)
你可能会想出更好的东西,但这可能会奏效。 在MSVC ++中测试。
#include <iostream>
#include <stdio.h>
#include <string.h>
#define PRINT_IF_THIS_EXISTS \
if (strchr(__FUNCTION__,':')) printf("this exists in %s!\n", __FUNCTION__)
class test
{
public:
test()
{
PRINT_IF_THIS_EXISTS;
}
};
void staticFunction()
{
PRINT_IF_THIS_EXISTS;
}
int main()
{
PRINT_IF_THIS_EXISTS;
staticFunction();
test t;
std::cin.get();
return 0;
}
答案 1 :(得分:0)
is_foo_static
在以下代码中检查X::foo()
是否为静态函数。
也许您可以在宏中使用它来判断它是否是此调用。
template<typename T>
struct is_foo_static {
template<typename X>
static std::true_type check(X*, decltype(X::foo())* = 0);
static std::false_type check(...);
typedef decltype(check((T*)(0))) _tmp;
static const bool value = _tmp::value;
};
struct FooStatic {
static void foo() {}
};
struct FooNonStatic {
void foo() {}
};
int main(){
cout<<boolalpha
<<is_foo_static<FooStatic>::value<<endl
<<is_foo_static<FooNonStatic>::value<<endl;
return 0;
}