gpt4 book ai didi

c++ - 创建一个返回 std::mem_fn 或 boost::mem_fn 的通用包装器

转载 作者:行者123 更新时间:2023-11-28 06:06:40 28 4
gpt4 key购买 nike

KDE/PIM Zanshin 项目在其代码中的多个位置使用了 std::mem_fn,结果证明至少有 1 个版本的 Apple clang(随 OS X 10.9 提供的最新 Xcode 提供的版本)生成无法链接所涉及的许多文件的目标代码。

事实证明,使用 boost::mem_fn 而不是 std::mem_fn 可以规避这个问题。该项目的主要作者不倾向于增加对所有平台的 boost 依赖,因此我提出了一个补丁,其中使用了一个条件宏,在需要时扩展为 boost::mem_fn

现在的请求是创建一个模板函数,该函数位于 zanshin 自己的命名空间之一 (Utils::mem_fn(f)) 中,并返回 std::mem_fn(f) boost::mem_fn(f)。这就是高于我当前薪资等级的部分……或者这根本不可行,我什至几乎不了解 mem_fn 函数的用途。

所以问题是:是否有一种简单、紧凑的方式来包装 std::mem_fn,最好是使用单个模板函数?

主要障碍似乎是返回类型,但由于 zanshin 代码中的所有使用似乎都返回归结为函数指针的内容,因此我尝试使用 void* 返回类型。我预计它会失败,而事实确实如此。

最佳答案

"The project's main author is not inclined to increase the boost dependency on all platforms"

所以他反而给项目增加了不一致的依赖项?听起来很乱。

此外,它根本不是特定于平台的依赖关系,因为您可以简单地将相关 header 包含在代码库中(另请参阅 BCP),并且首先不存在相关的运行时依赖关系。

也就是说,更简单的选择是使用一个包装器来包装 std::mem_fn 并同时执行(地址)引用的成员。这样,链接问题实际上应该消失了。

最简单的事情是(c++14):

template <typename PTMorPTMF>
auto my_mem_fn(PTMorPTMF const& ptm) {
return std::mem_fn(ptm);
}

如果你被 c++11 困住了:

template <typename PTMorPTMF>
auto my_mem_fn(PTMorPTMF const& ptm) -> decltype(std::mem_fn(ptm)) {
return std::mem_fn(ptm);
}

简单地 #ifdef 实现,如果您最终在一个平台上使用 boost 来实现它。

关于c++ - 创建一个返回 std::mem_fn 或 boost::mem_fn 的通用包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32255435/

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