KDE / PIM Zanshin项目在其代码中的多个位置使用std :: mem_fn,结果至少有一个版本的Apple's clang(最新Xcode附带的一个版本可用于操作系统) X 10.9)生成的目标代码无法链接到所涉及的许多文件。
事实证明,使用boost::mem_fn
代替std::mem_fn
可以避免此问题。该项目的主要作者并不倾向于增加对所有平台的提升依赖性,因此我提出了一个补丁,其中使用条件宏,在需要时扩展到boost::mem_fn
。
现在请求创建一个模板函数,该函数位于zanshin自己的名称空间(Utils::mem_fn(f)
)之一,并返回std::mem_fn(f)
或boost::mem_fn(f)
。那就是超出我目前薪酬水平的那部分......或者这是不可行的,与我甚至不了解mem_fn函数的目的无关。
所以问题是:是否有一个 easy ,紧凑的方式来包装std::mem_fn
,理想情况下使用单个模板函数?
主要障碍似乎是返回类型,但由于zanshin代码中的所有用法似乎都返回归结为函数指针,我尝试使用void*
返回类型。我预计会失败,事实确实如此。
答案 0 :(得分:1)
“该项目的主要作者并不倾向于增加对所有平台的提升依赖性”
所以相反,他为项目带来了不一致的依赖关系?听起来很歪。
此外,它根本不是特定于平台的意义上的依赖,因为您可以简单地在代码库中包含相关的标头(另请参阅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来实现一个平台。