是否可以使用某些关键字编译两个或更多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
如果可以对单个函数进行编码并添加一些关键字,那么它会根据不同的调用者编译一些变量,而不会占用函数的未使用部分。
答案 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
函数来改变迭代中发生的事情。