C++ ';这';宏和函数中的指针

C++ ';这';宏和函数中的指针,c++,macros,inline,this,C++,Macros,Inline,This,我有一些代码使用类的“this”指针来调用这些代码。例如: Some::staticFunction<templateType>(bind(FuncPointer, this, _1)); Some::staticFunction(bind(FuncPointer,this,_1)); 下面是我从boost调用的bind函数。但这并不重要。现在我必须包装这段代码。我做了一个宏: #define DO(Type, Func) Some::staticFunction<Type

我有一些代码使用类的“this”指针来调用这些代码。例如:

Some::staticFunction<templateType>(bind(FuncPointer, this, _1));
Some::staticFunction(bind(FuncPointer,this,_1));
下面是我从boost调用的bind函数。但这并不重要。现在我必须包装这段代码。我做了一个宏:

#define DO(Type, Func) Some::staticFunction<Type>(bind(FuncPointer, this, _1));
#定义DO(Type,Func)Some::staticFunction(bind(FuncPointer,this,_1));

编译器将此代码插入到调用此宏的类中,所以“this”从调用方获取。但我不想使用宏,更喜欢函数(内联)。但如何解决“这个”通过。我可以像在宏中一样在内联函数中使用它,还是必须手动传递它?

内联函数是一个常规函数,必须能够自行编译。inline关键字只是一个建议,为了优化的原因,它建议编译器将实际函数体放在调用函数的地方。 在特定情况下,内联函数无法访问仅在调用位置可见的名称(在您的示例中为“this”),因此必须将它们作为参数传递

另一方面,宏只是在预处理时发生的文本扩展,所以宏体不需要有一个本身的含义,只要“强”>最终< /强>扩展是合法的C++代码,就可以实现所有的事情。
例如,您可以使用一个宏“打开”For循环,另一个宏“关闭”For循环(这显然是内联函数无法做到的)。

内联函数是一个常规函数,必须能够自行编译。inline关键字只是一个建议,为了优化的原因,它建议编译器将实际函数体放在调用函数的地方。 在特定情况下,内联函数无法访问仅在调用位置可见的名称(在您的示例中为“this”),因此必须将它们作为参数传递

另一方面,宏只是在预处理时发生的文本扩展,所以宏体不需要有一个本身的含义,只要“强”>最终< /强>扩展是合法的C++代码,就可以实现所有的事情。
例如,您可以使用一个宏“打开”For循环,另一个宏“关闭”For循环(这显然是内联函数无法做到的)。您调用的函数可以放置
这个
关键字

class MyClass {
  // ...
  template<typename Type, typename Func>
  void doit(Func f) {
    Some::staticFunction<Type>(bind(f, this, _1));
  }
};

这将尝试向宏传递3个参数,而不是2个。您可以颠倒类型和函数的顺序,并使用可变宏(这是C++0x功能,但在某些编译器的C++03模式下可用),也可以使用typedef并传递别名

您调用的函数可以放置
这个
关键字

class MyClass {
  // ...
  template<typename Type, typename Func>
  void doit(Func f) {
    Some::staticFunction<Type>(bind(f, this, _1));
  }
};

这将尝试向宏传递3个参数,而不是2个。您可以颠倒类型和函数的顺序,并使用可变宏(这是C++0x功能,但在某些编译器的C++03模式下可用),也可以使用typedef并传递别名

看起来你给了
这个
一个与原始代码完全不同的含义。C++没有任何类似UpVa@本的东西,我不知道TCL,但是我做的事情并没有改变<代码>的值< <代码> >:插入中间函数调用不会影响它的值。在原始代码中,
引用当前对象,在我的代码中也是如此。请注意,我并不打算将
doit
传递到
bind
。但是我建议用调用
doit
@Noah来代替宏调用。习惯上,一旦你发现自己错了,就收回你的否决票,或者评论你为什么保留这个选项downvote@Noah:您是否希望他在访问指针之前检查每个指针是否为空?不安全结构的安全使用是每个C++应用程序中固有的。+ 1:引人入胜。我不知道你可以使用C风格的强制转换将静态强制转换为不可访问的基。看起来你给了
这个
一个与原始代码完全不同的含义。C++没有任何类似UpVa@本的东西,我不知道TCL,但是我做的事情并没有改变<代码>的值< <代码> >:插入中间函数调用不会影响它的值。在原始代码中,
引用当前对象,在我的代码中也是如此。请注意,我并不打算将
doit
传递到
bind
。但是我建议用调用
doit
@Noah来代替宏调用。习惯上,一旦你发现自己错了,就收回你的否决票,或者评论你为什么保留这个选项downvote@Noah:您是否希望他在访问指针之前检查每个指针是否为空?不安全结构的安全使用是每个C++应用程序中固有的。+ 1:引人入胜。我不知道您可以使用C样式的强制转换将静态强制转换到无法访问的基础。
// T must be a derived class of MyRegister<T>
template<typename T>
class MyRegister {
protected:
  template<typename Type, typename Func>
  void doit(Func f) {
    Some::staticFunction<Type>(bind(f, (T*)this, _1));
  }
};

class MyClass : MyRegister<MyClass> {
  // ...
};
DO(std::pair<A, B>, g);