C 功能内容基于呼叫者

C++ function content based on caller

本文关键字:呼叫者 功能      更新时间:2023-10-16

是否有可能使用一些关键字来编译两个或多个C 功能内容的变化,该关键字可以根据函数呼叫者的身份执行什么,而无需为每个呼叫者制作完整函数的多个副本?

到目前为止的解决方案一直是使用参数来进行功能和语句,以执行根据呼叫者。

V sol::compare(uchar start_lev, V *a , V *b){
solMutex.lock(); // not needed by all callers 
for(auto lev:solVec){ 
switch (lev.group){ 
case a: 
dontRemove=0;
val++; // not used by all callers
return something; 
case b: 
val++; //not used by all callers
return something; 
case c: 
      etc... 
} 
#ifdef QT_DEBUG // not needed by all callers

如果可以编码单个函数并添加一些关键字,因此它会根据不同的呼叫者而没有函数未使用的部分的空间进行编译。

我不确定最后对宏有什么处理,但是您可以做自己想做的事情:

template <bool do_lock, bool do_increment>
V sol::compare(uchar start_lev, V *a , V *b){
  if (do_lock) solMutex.lock(); // not needed by all callers 
  for(auto lev:solVec){ 
    switch (lev.group){ 
    case a: 
      dontRemove=0;
      if (do_increment) val++; // not used by all callers
      return something; 
    case b: 
      if (do_increment) val++; //not used by all callers
      return something; 
    case c: 
      etc... 
}

要打电话给您,然后您会做

auto v = sol::compare<false, false>(....);

并根据特定呼叫者是否需要它来改变这些布尔值。请注意,由于编译器正在为每种布尔值组合生成不同的函数,因此您都知道您在编译时喂食的布尔值。因为布尔人在编译时已知,所以这些分支将(如果布尔为false),则只会被任何编译器作为死亡代码修剪。

您随后在评论中给出了几个想法的草图。

V sol::compare(uchar start_lev, V *a , V *b) {
    solMutex.lock(); // not needed by all callers
    for(auto lev:solVec){
       switch (lev.group){
           case a:
               dontRemove=0;
               val++; // not used by all callers 
               return something;
           case b:
               val++; //not used by all callers
               return something;
           case c: 
               ///etc...
      } 
      #ifdef QT_DEBUG // not needed by all callers
}

对于预处理器而言,您无能为力,代码。

除此之外,您还可以使用布尔人。有其他选择。

对于其他模式,您可以分开共性和差异。例如,如果solMutex是一些虚构sol调用的成员变量,我们可以有一个lockingSol

class sol
{
public:
    V sol::compare(uchar start_lev, V *a , V *b);
        for(auto lev:solVec){
            //etc
        } 
    }
 };

class lockingSol
{
public:
    V compare(uchar start_lev, V *a , V *b)
    {
        solMutex.lock();
        return sol_.compare(start_lev, a, b);
    }
private:
    mutex solMutex;
    sol sol_;
};

这允许nonlockingSol调用solMutex.lock();,然后调用sol_的方法。

模板和Stragey Desgin模式为您提供了切换行为的方法。

另外,您可以将函数或lambda发送到旋转算法中间发生的事情。标准库ITESELF给出了许多例子。

例如考虑

template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );

这对某些东西进行了迭代,呼叫者在Compare函数中发送以改变迭代中发生的事情。