【发布时间】:2022-01-19 01:39:45
【问题描述】:
我目前正在努力使用 lambda 表达式。 我创建了一个 ConcurrentDictionary ,它用互斥锁包装了 std::map 。 现在我想导出所有符合指定条件的元素。
template<typename MutexTypeT, typename Key_Type_T, typename Mapped_Type_T>
class CConcurrentDictionary
{
public:
///Constructor
CConcurrentDictionary();
class CSingleElement
{
public:
///the key
Key_Type_T key = { };
///THe Mapped Type
Mapped_Type_T mapped_type = { };
};
template<typename ...Args_T>
std::vector<CSingleElement> exportSelectedData(
const uint32_t u32MutexTimeout,
std::function<bool(const CSingleElement, Args_T &&...)> compareFn,
Args_T&&...CompareArgs...) const;
}
template<typename MutexTypeT, typename Key_Type_T, typename Mapped_Type_T>
template<typename ...Args_T>
auto CConcurrentDictionary<MutexTypeT, Key_Type_T, Mapped_Type_T>::exportSelectedData(
const uint32_t u32MutexTimeout,
std::function<bool(const CSingleElement, Args_T &&...)> compareFn,
Args_T&&...CompareArgs...) const ->
std::vector<CSingleElement>
{
//lock mutex...
std::vector<CSingleElement> vecRes;
for (const auto &single_element : dictionary)
{
if(compareFn(single_element, CompareArgs...))
{
//this element mathes the preconditions
vecRes.push_back(single_element);
}
}
return vecRes;
}
但是当我尝试像这样使用这个类时
class CTraceCmdDuration
{
public:
///Cmd Datatype
using CmdType_T = uint32_t;
class CCmdSummary
{
public:
/**
* SIngle Long Running Cmd Summary
* @param CmdIdArg Cmd ID
* @param u32MaxCmdDurationArg Max CmdDuration
*/
CCmdSummary(const CmdType_T CmdIdArg, const uint32_t u32MaxCmdDurationArg);
///Id of this cmd
const CmdType_T CmdId;
///Duration of this cmd
const uint32_t u32MaxCmdDuration;
};
/**
* Exports all Cmds to a vector with took longer than u32MaxCmdDuration
* @param u32MaxCmdDuration Maximal Cmd Processing duration time. Cmds that took longer than this will be exported
* @param u32MutexTimeout Mutex Timeout
* @return List with all long running cmds
*/
std::vector<CCmdSummary> ExportLongRunningCmds(const uint32_t u32MaxCmdDuration, const uint32_t u32MutexTimeout) const;
}
auto CTraceCmdDuration::ExportLongRunningCmds(const uint32_t u32MaxCmdDuration, const uint32_t u32MutexTimeout) const ->
std::vector<CCmdSummary>
{
auto lambda = [u32MaxCmdDuration](const CombinedDictElement& singleElement)
{
const bool bRes = (u32MaxCmdDuration < singleElement.mapped_type.u32MaxProcessingDuration);
return bRes;
};
auto vecRes = dict.exportSelectedData(u32MutexTimeout, lambda, u32MaxCmdDuration);
return vecRes;
}
不幸的是,这不会产生对函数错误的匹配调用
error: no matching function for call to 'NConcurrent_Container::CConcurrentDictionary<NMutex::CEmbos_Mutex, long unsigned int, NDebug::CTraceCmdDuration::CProcessingInfo>::exportSelectedData(const uint32_t&, NDebug::CTraceCmdDuration::ExportLongRunningCmds(uint32_t, uint32_t) const::__lambda0&, const uint32_t&) const'
auto vecRes = dict.exportSelectedData(u32MutexTimeout, lambda, u32MaxCmdDuration);
我的 lambda 表达式有什么问题? 想法是将最大允许持续时间作为捕获传递,并将 std::map 中的每个存储元素作为参数传递。
或者你有更好的主意吗? 你能帮帮我吗?
编辑: 谢谢你的回答,如果我传递一个静态函数,这很好用 但是我如何将 lambda 作为模板参数传递呢?
static bool CompareDuaration(const CSingleElement&singleElement, const uint32_t u32MaxDuration);
auto CTraceCmdDuration::ExportLongRunningCmds(const uint32_t u32MaxCmdDuration, const uint32_t u32MutexTimeout) const ->
std::vector<CombinedDictElement>
{
auto vecRes = dict.exportSelectedData(u32MutexTimeout, lambda, u32MaxCmdDuration);
return vecRes;
}
这可行,但是
auto CTraceCmdDuration::ExportLongRunningCmds(const uint32_t u32MaxCmdDuration, const uint32_t u32MutexTimeout) const ->
std::vector<CombinedDictElement>
{
auto lambda = [u32MaxCmdDuration](const CombinedDictElement& singleElement)
{
const bool bRes = (u32MaxCmdDuration < singleElement.mapped_type.u32MaxProcessingDuration);
return bRes;
};
auto vecRes = dict.exportSelectedData(u32MutexTimeout, lambda, u32MaxCmdDuration);
return vecRes;
}
给我一个编译错误
error: no match for call to '(CTraceCmdDuration::ExportLongRunningCmds(uint32_t, uint32_t) const::__lambda0) (CConcurrentDictionary<NMutex::CEmbos_Mutex, long unsigned int, CTraceCmdDuration::CProcessingInfo>::CSingleElement&, const long unsigned int&)'
if(compareFn(singleElement, compareArgs...))
似乎将 lambdas 传递给模板并不能很好地工作。我错过了什么?
【问题讨论】:
-
什么是
CombinedDictElement?