我在以下代码中的意图是能够使用 lambda 作为参数调用虚函数。我的方式显然不对,因为不允许使用虚拟模板。
有什么方法吗?
// polymorphic base class
struct B {
virtual void set_val(int) = 0;
virtual int get_val() = 0;
virtual void set_next(B*) = 0;
template<typename FCall_T> // compiler error: no virtual templates allowed
virtual void for_each_node_do(FCall_T) = 0;
};
// derived class
struct D :
public B
{
int val;
D* p_next;
void set_val(int i) override { val = i; }
int get_val() override { return val; }
void set_next(B* p_next_)override { p_next = dynamic_cast<D*>(p_next_); };
template<typename FCall_T>
void for_each_node_do(FCall_T fnc) override {
fnc(this);
D* p_cur = p_next;
while(p_cur) {
fnc(p_cur);
p_cur = p_cur->p_next;
}
}
};
int main() {
// set up linked list
int cnt = 5;
B** ppB = new B*[cnt]; // array of base class ptrs
for(int i = 0; i < cnt; ++i)
ppB[i] = new D;
for(int i = 0; i < cnt; ++i) {
ppB[i]->set_val(i);
ppB[i]->set_next( (i < cnt-1) ? ppB[i+1] : nullptr);
}
B* p_root = ppB[0]; // base class ptr
// do something thru base class ptr
p_root->for_each_node_do(
[](B* pB){
pB->set_val(pB->get_val() * 10);
}
);
// do something else thru base class ptr
p_root->for_each_node_do(
[](B* pB){
cout << pB->get_val() << endl;
}
);
return 0;
}
我考虑将B::for_each_node_do()
声明为:
virtual void for_each_node_do(void(*)(B*)) = 0;
...并根据需要声明尽可能多的自由函数作为参数使用,但正如我上面所述,我想知道是否有办法使 lambdas 作为参数