C 功能内容基于呼叫者
C++ function content based on caller
是否有可能使用一些关键字来编译两个或多个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
函数中发送以改变迭代中发生的事情。
相关文章:
- 组件X86转换为ARM功能呼叫,其中有不同数量的参数为ARM
- 如何存储指针以功能模板,该模板将可呼叫对象作为其参数之一
- 将整数(文字)与函数相关联,让呼叫者查询拖鞋的数量
- 错误:呼叫构造器的匹配函数无匹配功能
- 将功能存储在班级中,而无需呼叫开销
- 模板功能不使用RVALUE参考实例化/接收呼叫
- C 呼叫功能具有许多不同类型
- C 功能接受给定模板签名的任何可呼叫
- 隐藏方法的实例返回到呼叫者
- 呼叫功能时JNI C Android应用程序崩溃
- 错误 - 无需匹配功能,将类别为属性C 呼叫
- C 功能内容基于呼叫者
- 检查变量是否满足没有呼叫的过载功能
- glutkeyboardfunc呼叫功能不起作用
- 从DLL到EXE C 的呼叫功能
- 在静态库中的主呼叫功能
- 日志C 类方法呼叫者(功能名称,行号)
- Callee返回对象的范围W.R.T.呼叫者本地变量
- 透明地将临时插入呼叫者的作用域
- C++ 偷看堆栈以获取呼叫者信息