void ReduceClassTemplateParameter::removeParameterFromMethods()
{
  CXXRecordDecl *CXXRD = TheClassTemplateDecl->getTemplatedDecl();
  for (auto I = CXXRD->method_begin(), E = CXXRD->method_end();
       I != E; ++I) {
    ClassTemplateMethodVisitor V(this, TheParameterIndex);
    V.TraverseDecl(*I);
  }
}
bool FlattenCFGTransformer::HandleAnyClassDecl(Decl *D) {
	DPRINT("enter ClassDecl");
	CXXRecordDecl *cd = NULL;
	if(ClassTemplateDecl *td = dyn_cast<ClassTemplateDecl>(D)) { // class template
		cd = td->getTemplatedDecl();
	} else if(CXXRecordDecl *td = dyn_cast<CXXRecordDecl>(D)) { // class
		cd = td;
	} else {
		DPRINT("not class type Decl");
		return false;
	}

	assert(cd && "get CXXRecordDecl failed");

	// process all member methods
	for(CXXRecordDecl::method_iterator I = cd->method_begin(), E = cd->method_end(); 
			I != E; ++I){
		HandleAnyFunctionDecl(*I);
	}
	return true;
}