基于调用者的C ++函数内容

时间:2017-03-03 13:26:19

标签: c++

是否可以使用某些关键字编译两个或更多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

如果可以对单个函数进行编码并添加一些关键字,那么它会根据不同的调用者编译一些变量,而不会占用函数的未使用部分。

2 个答案:

答案 0 :(得分:1)

我不确定最终宏的处理是什么,但你可以这样做你想做的事情:

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>(....);

根据特定来电者是否需要,改变那些布尔值。请注意,由于编译器为每个布尔值组合生成不同的函数,因此 知道您在编译时输入的布尔值。因为布尔值在编译时是已知的,所以这些分支(如果bool为假)只是被任何编译器删除为死代码。

答案 1 :(得分:1)

您随后在评论中草拟了几个想法。

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设计模式为您提供了切换行为的方法。

或者你可以发送一个函子或lambda来解决算法中间发生的事情。标准库iteself给出了很多这方面的例子。

例如考虑

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

迭代某些东西,调用者发送Compare函数来改变迭代中发生的事情。