简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
本篇目的:理解std::map
如何实例化ComponentLoader对象。
#include
#include
#include
#include
#include
using namespace std;
struct ComponentModule {
public:
void init(std::string libPath){
printf("%s(), line = %d, libpath = %s\n",__FUNCTION__,__LINE__,libPath.c_str());
}
};
struct ComponentLoader {
public:
ComponentLoader(std::string libPath) : mLibPath(libPath) {
printf("%s(), line = %d, libpath = %s\n",__FUNCTION__,__LINE__,mLibPath.c_str());
}
void fetchModule() {
std::shared_ptr<ComponentModule> localModule = std::make_shared<ComponentModule>();
localModule->init(mLibPath);
}
std::string mLibPath;
};
int main(){
//map容器,第一个参数string,第二个是ComponentLoader类.
std::map<string, ComponentLoader> mComponents;
//v1.0
//auto emplace = [&](const char *libPath) {
//v2.0 function定义
function<void (const char*)> emplace = [&](const char *libPath) {
//构造函数ComponentLoader实例化,emplace插入键值对
mComponents.emplace(libPath, libPath);
};
emplace("libcodec2_soft_aacdec.so");
emplace("libcodec2_soft_aacenc.so");
emplace("libcodec2_soft_amrnbenc.so");
}
注释:
mComponents.emplace(libPath, libPath)插入key-value键值对,其实际形式可以写为:map
第一个字段就是string类型
第二个参数传入ComponentLoader类构造函数,它的构造函数实现
ComponentLoader(std::string libPath) : mLibPath(libPath) {
printf("%s(), line = %d, libpath = %s\n",__FUNCTION__,__LINE__,mLibPath.c_str());
}
ComponentLoader构造函数初始化列表,将传入的libPath赋值给mLibPath成员函数。在可以调用fetchModule函数直接使用。
#include
#include
#include
#include
#include
using namespace std;
struct ComponentModule {
public:
void init(std::string libPath){
printf("%s(), line = %d, libpath = %s\n",__FUNCTION__,__LINE__,libPath.c_str());
}
};
struct ComponentLoader {
public:
ComponentLoader(std::string libPath) : mLibPath(libPath) {
printf("%s(), line = %d, libpath = %s\n",__FUNCTION__,__LINE__,mLibPath.c_str());
}
void fetchModule() {
std::shared_ptr<ComponentModule> localModule = std::make_shared<ComponentModule>();
localModule->init(mLibPath);
}
std::string mLibPath;
};
int main(){
//map容器,第一个参数string,第二个是ComponentLoader类.
std::map<string, ComponentLoader> mComponents;
//v1.0
//auto emplace = [&](const char *libPath) {
//v2.0 function定义
function<void (const char*)> emplace = [&](const char *libPath) {
//构造函数ComponentLoader实例化,emplace插入键值对
mComponents.emplace(libPath, libPath);
};
emplace("libcodec2_soft_aacdec.so");
emplace("libcodec2_soft_aacenc.so");
emplace("libcodec2_soft_amrnbenc.so");
#if 0
printf("\n");
//v1.0使用auto遍历map
for (auto &pathAndLoader : mComponents) {
const string &path = pathAndLoader.first;
ComponentLoader &loader = pathAndLoader.second;
loader.fetchModule();
}
printf("\n");
//v2.0使用pair遍历map
for (std::pair<const string, ComponentLoader> &pathAndLoader : mComponents) {
const string &path = pathAndLoader.first;
ComponentLoader &loader = pathAndLoader.second;
loader.fetchModule();
}
printf("\n");
//v3.0使用迭代器遍历map
std::map<std::string, ComponentLoader>::iterator it;
for (it = mComponents.begin(); it != mComponents.end(); it++) {
//std::string key = it->first;
//ComponentLoader &value = it->second;
printf("key = %s\n",it->first.c_str());
it->second.fetchModule();
}
#endif
}