gpt4 book ai didi

C++ 快速绑定(bind)成员函数的方法

转载 作者:搜寻专家 更新时间:2023-10-31 01:06:09 24 4
gpt4 key购买 nike

我有一个类转换,里面有一个成员函数rate。我正在寻求一种方法,允许我将自定义设计的 rate 插入到 transition 的瞬间,在这些瞬间被创建之后,并且在运行时会很快!

我想优化代码以 boost 速度。 rate 进行简单的计算,但被程序调用得非常频繁和多次。所以我想我应该避免虚函数... 问题:在 C++ 中实现此目的的其他最佳方法是什么(模板、 boost ...)?关于特定方法的速度的评论将不胜感激。谢谢!

class transition {
public:
transition() : vec() {}
double rate(T_vec::iterator a) { return ...; }
private:
T_vec vec;
};

/* custom rate #1 */
double my_rate_1( T_vec::iterator) {
/* do something */
return ans;
}

/* custom rate #2 */
double my_rate_2( T_vec::iterator) {
/* do something */
return ans;
}

const int N=10;

int main (void) {

vector<transition*> ts(N);
for(int i=0;i!=N;++i) ts[i] = new transition;

/* How to efficiently implement the pseudo code that follows? */

ts[0]->rate = my_rate_1;
ts[1]->rate = my_rate_2;

/* ... */

}

最佳答案

至少有三种方法可以实现。

选项 1 是虚拟方法。创建实例后无法绑定(bind)方法,但创建后可以将所有派生类视为transition

class transition {
...
virtual double rate(T_vec::iterator a) = 0;
};

class my_transition_1 : public transition {
...
double rate(T_vec::iterator a) { ... }
};
class my_transition_2 : public transition {
...
double rate(T_vec::iterator a) { ... }
};

选项 2 是回调。创建对象后,您可以在运行时更改方法。这是最有活力的。在这种情况下,它的开销略高,因为有一个额外的迭代器复制构造,并且编译器更难优化掉间接调用。

class transition {
public:
....
typedef double (*RateFunction)(T_vec::iterator a);
void set_rate(RateFunction r) { _fun = r; }
double rate(T_vec::iterator a) { return (*_fun)(a); }
private:
RateFunction _fun;
};
double my_rate_1(T_vec::iterator a) {
...
}
...
transition t;
t.set_rate(my_rate_1);

选项 3 是仿函数模板。您必须在构造时指定所有内容,但这避免了间接调用并具有最佳性能。

template <typename Rate>
class transition {
double rate(T_vec::iterator a) {
return Rate()(a);
}
};
class my_rate_1 {
double operator()(T_vec::iterator a) {
....
}
};
class my_rate_2 {
double operator()(T_vec::iterator a) {
....
}
};

transition<my_rate_1> t1;
transition<my_rate_2> t2;

选项 4 不可扩展,但您避免了间接函数调用,并有机会在创建对象后设置速率。

class transition {
public:
enum RateCode {
RATE_1,
RATE_2,
...
}
double rate(T_vec::iterator i) {
switch (_rate_code) {
case RATE_1: {
...
return result;
}
case RATE_2: {
...
return result;
}
default:
assert(false);
}
}
void setRate(RateCode r) { _rate_code = r; }
private:
RateCode _rate_code;
}

关于C++ 快速绑定(bind)成员函数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21368983/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com