如何解决继承与std ::函数,用于编写与平台无关的代码
我正在评估使用lambda代替继承来编写平台独立代码的可能性。我经常必须传递回调(用于记录日志,进行HW通信等)。
通常,将使用继承和虚函数来实现想要做的事情。在下面的示例中,test
类将在不同平台和编译器(从PC到小型MCU)之间的单独文件中共享。
priv_test
将由test
类的用户定义,并且将取决于项目。
volatile int a = 0;
struct test
{
virtual int callback(int i) = 0;
test()
{}
void do_something()
{
a += callback(5);
}
};
struct priv_test:public test
{
using test::test;
int callback(int i) override
{
return i+2;
}
};
int main()
{
priv_test instance;
instance.do_something();
}
在这个简单的示例中,编译器的输出得到了很好的优化:https://godbolt.org/z/P16cMP
另一种方法是像这样使用lambda:
#include <functional>
volatile int a = 0;
struct test
{
struct conf
{
std::function<int(int)> callback;
};
test(const conf& config) : config(config)
{}
void do_something()
{
a += config.callback(5);
}
private:
const conf& config;
};
int main()
{
test::conf config{[](int i) {return i+2;}};
test instance(config);
instance.do_something();
}
在后一种情况下,它对于最终用户而言相当容易使用,并且非常灵活。但是,即使编译器实现相同的功能(在此示例中),其输出也很大:https://godbolt.org/z/P4zPnP
- 那么,您将如何编写需要某种回调的类?为什么?
- 您是否认为其他代码架构比上面提供的更好?
- 第二个版本可以进一步优化吗?
PS:代码大小和性能对我来说很重要。通常,我只有这些类的几个实例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。