我用c ++编写了几个月,现在我已经开始实现我自己的库了,我已经发现自己一次又一次地重复使用。让我烦恼的一件事是,你总是必须为std::accumulate
,std::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命名空间中执行重载函数的最合适方法是什么(注意这些函数只能作为原始函数的代理)?
答案 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。
- 宏
醇>
请参阅Macros
- Wrapper Function / Functor
醇>
还不错......只要你做得正确,你就可以做到这一点,这就是Ranges为容器所做的事情......参见前面提到的实现
- 醇>
重载功能
- 重载命名空间
中的每个函数std
...
不要这样做...... C ++标准不喜欢它。
了解标准的含义
$17.6.4.2.1如果C ++程序在命名空间std或命名空间中添加声明或定义,则它的行为是未定义的 命名空间std,除非另有说明。程序可以添加模板 专门用于任何标准库模板到命名空间std 如果声明取决于用户定义的类型和 专业化符合标准库的要求 原始模板并未明确禁止。