這個問題在這里已經有了答案: 是否可以將 lambda 運算式放入 C 中的映射或串列中? (3 個回答) 在地圖中使用 Lambda 1 個答案 3天前關閉。
我需要通過讀取“組態檔”來初始化一堆模板類。
模板類類似于:
class generic_block {
protected:
std::string name;
std::size_t size;
public:
generic_block(std::string _name, std::size_t _size)
: name(_name)
, size(_size)
{
}
virtual ~generic_block() {}
};
template <class T> class block: public generic_block {
private:
T *ptr;
public:
block(std::string _name, T *_ptr, std::size_t _size)
: generic_block(_name, _size)
, ptr(_ptr)
{
}
virtual ~AWblock() {}
...
}
我有暫定的發行代碼:
std::map<std::string, auto> types = {
{"uint32_t", [](char *name, int count){
uint32_t *ary = (uint32_t *)calloc(count, sizeof(uint32_t));
return block<uint32_t>(name, ary, count);
}},
{"float", [](char *name, int count){
float *ary = (float *)calloc(count, sizeof(float));
return block<float>(name, ary, count);
}}
};
generic_block b = types[type](name, count);
編譯炸彈:error: ‘auto’ not permitted in template argument,這是可以理解的。
問題是:我應該用什么來代替“ auto”?
注意:在實際代碼中,我計劃使用前處理器宏來生成“ types”,但我不確定這種方法是否是“最佳實踐”;歡迎評論,當然。
uj5u.com熱心網友回復:
您可以使用std::function顯式描述 lambda:
std::map<std::string, std::function<generic_block(char*, int)>> types = {
{"uint32_t", [](char *name, int count){
// ...
}},
{"float", [](char *name, int count){
// ...
}}
};
auto& block_generator = types[type];
generic_block b = block_generator(name, count);
當然,要求是映射中的所有函式具有相同的簽名。因此,除非所有Ts 都相同,否則您必須使用generic_block而不是block<T>.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/489106.html
上一篇:工廠根據列舉值創建不同的型別c
