gpt4 book ai didi

c++ - 尝试为 MFC 的 CMap 编写 for_each 算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:45:05 26 4
gpt4 key购买 nike

是的,我知道我应该制作一个迭代器,但我需要快速完成这项工作,为任何与 VC++ 相关的东西编写一个合适的迭代器实在是太令人沮丧了。 (这也适用于许多其他标准的东西,并且正在增加我的工作量。:( )

所以我写了一个 for_each() 算法来处理脏话:

template <typename K, typename AK, typename V, typename AV>
void for_each(CMap<K, AK, V, AV>& container, std::function<void(AK, AV)> body)
{
POSITION pos = container.GetStartPosition();
while (pos != NULL)
{
AK key;
AV value;
// Get key and value
container .GetNextAssoc(pos, key, value);
body(key, value);
}
}

但是显然VC++不能为函数模板推导出AK和AV。这是正常现象还是 VC++ 的又一个限制?

编辑这是请求的错误:

1>d:\projects\clean\cv32\cvcustombuttoninfo.cpp(113): error C2784: 'void for_each(CMap<KEY,ARG_KEY,VALUE,ARG_VALUE> &,std::function<void(AK,AV)>)' : could not deduce template argument for 'std::function<void(AK,AV)>' from 'CCVCustomRibbonInfo::WriteFile::<lambda_0513c2955d2b7b0197efcf2b0ce9322b>'
1> d:\projects\clean\cv32\cvcustombuttoninfo.cpp(66) : see declaration of 'for_each'

这似乎也发生在带有 -std=c++11 参数的 gcc 4.9.0 上。

#include <functional>
template <typename T>
void fn(T t, std::function<void(T)>)
{
}

int main()
{
int i;
fn(i, [](int i){});
return 0;
}

[DEMO]

还有 g++ 错误:

/tmp/gcc-explorer-compiler115110-34-1cr9oud/example.cpp: In function 'int main()':
11 : error: no matching function for call to 'fn(int&, main()::)'
fn(i, [](int i){});
^
11 : note: candidate is:
4 : note: template void fn(T, std::function)
void fn(T t, std::function<void(T)>)
^
4 : note: template argument deduction/substitution failed:
11 : note: 'main()::' is not derived from 'std::function'
fn(i, [](int i){});
^
Compilation failed

最佳答案

C++ lambda 与 std::function 的类型不同具有相同的签名。这就是模板参数推导失败的原因——它或多或少适用于精确类型。使用 template argument deduction 不考虑转换.您不想使用 std::function在你的模板参数中。要强制签名,您可以检查 Func可转换为 std::function<void(AK, AV)> .

template <typename K, typename AK, typename V, typename AV, typename Func, typename = std::enable_if_t<std::is_convertible<Func, std::function<void(AK, AV)>>::value> >
void for_each(CMap<K, AK, V, AV>& container, Func body)
{
POSITION pos = container.GetStartPosition();
while (pos != NULL)
{
AK key;
AV value;
// Get key and value
container .GetNextAssoc(pos, key, value);
body(key, value);
}
}

关于c++ - 尝试为 MFC 的 CMap 编写 for_each 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28437404/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com