LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 695|回复: 3

求教:LoopInfo &LI = getAnalysis<LoopInfo>(*F);是什么意思?

[复制链接]
发表于 2010-11-10 13:43:17 | 显示全部楼层 |阅读模式
最近看别人的程序时,发现居然有
LoopInfo &LI = getAnalysis<LoopInfo>(*F);
这样的代码,百思不得其解,不知道getAnalysis是函数还是类中的方法?
得到相关代码如下:
00167 /// getAnalysisIfAvailable<AnalysisType>() - Subclasses use this function to
00168 /// get analysis information that might be around, for example to update it.
00174 ///
00175 template<typename AnalysisType>
00176 AnalysisType *Pass::getAnalysisIfAvailable() const {
00177   assert(Resolver && "ass not resident in a PassManager object!");
00178
00179   const void *PI = &AnalysisType::ID;
00180
00181   Pass *ResultPass = Resolver->getAnalysisIfAvailable(PI, true);
00182   if (ResultPass == 0) return 0;
00183
00188   return (AnalysisType*)ResultPass->getAdjustedAnalysisPointer(PI);
00189 }

00191 /// getAnalysis<AnalysisType>() - This function is used by subclasses to get
00192 /// to the analysis information that they claim to use by overriding the
00193 /// getAnalysisUsage function.
00194 ///
00195 template<typename AnalysisType>
00196 AnalysisType &ass::getAnalysis() const {
00197   assert(Resolver && "ass has not been inserted into a PassManager object!");
00198   return getAnalysisID<AnalysisType>(&AnalysisType::ID);
00199 }

00201 template<typename AnalysisType>
00202 AnalysisType &ass::getAnalysisID(AnalysisID PI) const {
00203   assert(PI && "getAnalysis for unregistered pass!");
00204   assert(Resolver&&"ass has not been inserted into a PassManager object!");
00208   Pass *ResultPass = Resolver->findImplPass(PI);
00209   assert (ResultPass &&
00210           "getAnalysis*() called on an analysis that was not "
00211           "'required' by pass!");
00217   return *(AnalysisType*)ResultPass->getAdjustedAnalysisPointer(PI);
00218 }

00220 /// getAnalysis<AnalysisType>() - This function is used by subclasses to get
00221 /// to the analysis information that they claim to use by overriding the
00222 /// getAnalysisUsage function.
00223 ///
00224 template<typename AnalysisType>
00225 AnalysisType &ass::getAnalysis(Function &F) {
00226   assert(Resolver &&"ass has not been inserted into a PassManager object!");
00227
00228   return getAnalysisID<AnalysisType>(&AnalysisType::ID, F);
00229 }

00231 template<typename AnalysisType>
00232 AnalysisType &ass::getAnalysisID(AnalysisID PI, Function &F) {
00238   Pass *ResultPass = Resolver->findImplPass(this, PI, F);
00245   return *(AnalysisType*)ResultPass->getAdjustedAnalysisPointer(PI);
00246 }

望高手给解释。并还请有时间的高手给我写个简单的小程序,只要里面含有
int & a = getValue<int>(……);
并且能够编译通过的代码就行,谢谢了。
发表于 2010-11-10 15:12:04 | 显示全部楼层
找本c++的书,看看模板(template)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-11-10 21:02:40 | 显示全部楼层
非常感谢你,关于int & a = getValue<int>(……);
这个问题解决了。不过还有另一个疑问,实在无法解决,因此还请解释一下:

LoopInfo &LI = getAnalysis<LoopInfo>(*F);
里面用到的getAnalysis是一个类Pass里面的方法
类中的声明为:
class Pass{
.......................................................
   template<typename AnalysisType>
   AnalysisType &getAnalysis(Function &F);
};
该方法定义如下:
template<typename AnalysisType>
AnalysisType &ass::getAnalysis(Function &F) {
  assert(Resolver &&"ass has not been inserted into a PassManager object!");
  return getAnalysisID<AnalysisType>(&AnalysisType::ID, F);
}

本来我觉得这个方法不是静态方法,那么在用的时候就应该用对象来调用,但是
LoopInfo &LI = getAnalysis<LoopInfo>(*F);
这行代码不是想象的这样。不知道是什么情况,自己如此写了一个代码,发现不行。不知道该怎么写?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-11-11 08:32:23 | 显示全部楼层
非常感谢你的帮助,昨天晚上调试通过了,发现原来那个语句是写在有模板方法那个类的子类里面,所以就可以将方法当函数一样用,不需要用对象调用。
问题解决了,麻烦了。再次感谢你的热心帮忙。谢谢了!O(∩_∩)O~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表