STL扩展/修改最佳实践

时间:2016-04-23 16:57:47

标签: c++ visual-c++ c++14

我用c ++编写了几个月,现在我已经开始实现我自己的库了,我已经发现自己一次又一次地重复使用。让我烦恼的一件事是,你总是必须为std::accumulatestd::fill等函数提供开始和结束迭代器......

提供合格容器的选项完全不存在,只是一遍又一遍地写开始和结束只是一个烦恼。所以,我决定将这个功能添加到我的库中,但是我遇到了问题,我无法找到这样做的最佳方法。以下是我的一般解决方案:

1。宏

         - 封装整个函数调用的宏               恩。 QUICK_STL(FCall)

         - 一个带有容器,函数名和可选参数的宏               恩。 QUICK_STL(C,F,Args...)

2。包装函数/函数

         - 一个采用容器,函数名和可选参数的类               恩。 quick_stl(F, C, Args...)

第3。过载功能

         - 重载命名空间std中的每个函数或我的库名称空间

namespace std { // or my library root namespace 'cherry' 
    template <typename C, typename T>
    decltype(auto) count(const C& container, const T& value);
}



我通常避开宏,但在这种情况下可以确定地保存很多 写入的代码行。关于函数重载,我想要使用的每个函数都必须重载,这不会真正扩展。这种方法的好处是你保留了函数的名称。通过完美转发和decltype(auto)重载变得更加容易,但仍需要时间来实现,并且如果添加了另一个功能则必须进行修改。至于我是否应该重载std命名空间,我对在这种情况下它是否合适持怀疑态度。

在STD命名空间中执行重载函数的最合适方法是什么(注意这些函数只能作为原始函数的代理)?

1 个答案:

答案 0 :(得分:1)

您需要阅读:Why do all functions take only ranges, not containers?

而且:STL algorithms: Why no additional interface for containers (additional to iterator pairs)?

  

我用c ++写了几个月,我很舒服   现在已经足够开始实现我自己的库......

让我看看更光明的一面,然后说...我们之前有人曾经去过那里......: - )

  

唠叨我的一件事是,你总是要提供一个   函数的开始和结束迭代器   std :: accumulate,std :: fill etc ...

这就是为什么你有Boost.Ranges和Eric提出的ranges似乎不会让它变成C ++ 17。

  
      
  1.   

请参阅Macros

  
      
  1. Wrapper Function / Functor
  2.   

还不错......只要你做得正确,你就可以做到这一点,这就是Ranges为容器所做的事情......参见前面提到的实现

  
      
  1. 重载功能

         
        
    • 重载命名空间std ...
    • 中的每个函数   
  2.   

不要这样做...... C ++标准不喜欢它。

了解标准的含义

  

$17.6.4.2.1如果C ++程序在命名空间std或命名空间中添加声明或定义,则它的行为是未定义的   命名空间std,除非另有说明。程序可以添加模板   专门用于任何标准库模板到命名空间std   如果声明取决于用户定义的类型和   专业化符合标准库的要求   原始模板并未明确禁止。