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

时间:2015-08-27 17:04:14

标签: c++ c++11 boost wrapper return-type

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*返回类型。我预计会失败,事实确实如此。

1 个答案:

答案 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来实现一个平台。