使用它如果存在/检测C ++中当前作用域的调用约定(thiscall vs cdecl)

时间:2015-07-07 00:18:24

标签: c++

我正在尝试编写一个可以在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'相关的内容

2 个答案:

答案 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;
}