STL扩展/修改最佳实践 我已经用C++写了几个月了,现在我已经很舒服地开始了我自己的库了,我已经发现了我自己反复使用的东西。让我烦恼的一件事是,您总是必须为诸如std::acculate、std::fill等函数提供一个开始和结束迭代器 namespace std { // or my library root namespace 'cherry' template <typename C, typename T> decltype(auto) count(const C& container, const T& value); }
提供一个合格容器的选项完全不存在,一遍又一遍地写begin和end简直是一件麻烦事。所以,我决定将这个功能添加到我的库中,但我遇到了一个问题,我想不出最好的方法。以下是我的一般解决方案:STL扩展/修改最佳实践 我已经用C++写了几个月了,现在我已经很舒服地开始了我自己的库了,我已经发现了我自己反复使用的东西。让我烦恼的一件事是,您总是必须为诸如std::acculate、std::fill等函数提供一个开始和结束迭代器 namespace std { // or my library root namespace 'cherry' template <typename C, typename T> decltype(auto) count(const C& container, const T& value); },c++,visual-c++,c++14,C++,Visual C++,C++14,提供一个合格容器的选项完全不存在,一遍又一遍地写begin和end简直是一件麻烦事。所以,我决定将这个功能添加到我的库中,但我遇到了一个问题,我想不出最好的方法。以下是我的一般解决方案: namespace std { // or my library root namespace 'cherry' template <typename C, typename T> decltype(auto) count(const C& container, const
namespace std { // or my library root namespace 'cherry'
template <typename C, typename T>
decltype(auto) count(const C& container, const T& value);
}
1。宏
-封装整个函数调用的宏例如:快速(FCall)
-采用容器、函数名和可选参数的宏
例如
QUICK\u STL(C、F、Args…)
namespace std { // or my library root namespace 'cherry'
template <typename C, typename T>
decltype(auto) count(const C& container, const T& value);
}
2。包装函数/函子-采用容器、函数名和可选参数的类
例如,
quick\u stl(F,C,Args…)
namespace std { // or my library root namespace 'cherry'
template <typename C, typename T>
decltype(auto) count(const C& container, const T& value);
}
3。过载功能
-重载命名空间std
或我的库命名空间中的每个函数
前
namespace std { // or my library root namespace 'cherry'
template <typename C, typename T>
decltype(auto) count(const C& container, const T& value);
}
namespace std{//或我的库根命名空间'cherry'
模板
decltype(自动)计数(常数C和容器、常数T和值);
}
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
名称空间,我相当怀疑它在这种情况下是否合适
namespace std { // or my library root namespace 'cherry'
template <typename C, typename T>
decltype(auto) count(const C& container, const T& value);
}
在STD名称空间中重载函数最合适的方法是什么(注意,这些函数只作为原始函数的代理)?您需要阅读以下内容:
namespace std { // or my library root namespace 'cherry'
template <typename C, typename T>
decltype(auto) count(const C& container, const T& value);
}
这是:
namespace std { // or my library root namespace 'cherry'
template <typename C, typename T>
decltype(auto) count(const C& container, const T& value);
}
我用C++写了一个<强>几个月< /强>,我很舒服。
现在已经足够开始实现我自己的库了
namespace std { // or my library root namespace 'cherry'
template <typename C, typename T>
decltype(auto) count(const C& container, const T& value);
}
让我看看光明的一面,就说。。。我们中的一些人以前去过那里……:)
namespace std { // or my library root namespace 'cherry'
template <typename C, typename T>
decltype(auto) count(const C& container, const T& value);
}
有一件事让我烦恼,那就是你总是要提供
函数的开始和结束迭代器,如
标准::累积,标准::填充等
namespace std { // or my library root namespace 'cherry'
template <typename C, typename T>
decltype(auto) count(const C& container, const T& value);
}
这就是为什么你和埃里克的建议,似乎是不可能做到的C++17
namespace std { // or my library root namespace 'cherry'
template <typename C, typename T>
decltype(auto) count(const C& container, const T& value);
}
宏
看
namespace std { // or my library root namespace 'cherry'
template <typename C, typename T>
decltype(auto) count(const C& container, const T& value);
}
包装函数/函子
还不错…只要你做得正确,你就可以做到,这就是范围对容器的基本作用。。。请参见上述实现
namespace std { // or my library root namespace 'cherry'
template <typename C, typename T>
decltype(auto) count(const C& container, const T& value);
}
过载功能
namespace std { // or my library root namespace 'cherry'
template <typename C, typename T>
decltype(auto) count(const C& container, const T& value);
}
- 重载命名空间中的每个函数
std
不要那样做。。。C++标准不喜欢它。
namespace std { // or my library root namespace 'cherry'
template <typename C, typename T>
decltype(auto) count(const C& container, const T& value);
}
看看标准是怎么说的
namespace std { // or my library root namespace 'cherry'
template <typename C, typename T>
decltype(auto) count(const C& container, const T& value);
}
<> >如果将名称或定义添加到命名空间STD或命名空间内,则C++程序的行为是未定义的
名称空间std,除非另有规定。程序可以添加模板
仅将任何标准库模板专用化为命名空间std
如果声明依赖于用户定义的类型和
专业化满足
原始模板,并没有明确禁止
namespace std { // or my library root namespace 'cherry'
template <typename C, typename T>
decltype(auto) count(const C& container, const T& value);
}
我通常避开宏啊,好。。。但在这种情况下,它可以避免编写大量代码。不!!!这是个陷阱!!!