Please take note of the updates at the end of this post.
Update: I have created a public project on GitHub for this library!
I would like to have a single template that once and for all takes care of pretty-printing all STL containers via operator<<. In pseudo code, I'm looking for something like this:
template<container C, class T, String delim = ", ", String open = "[", String close = "]">
std::ostream & operator<<(std::ostream & o, const C<T> …Run Code Online (Sandbox Code Playgroud) 我要求一个模板技巧来检测一个类是否具有给定签名的特定成员函数.
问题类似于这里引用的问题 http://www.gotw.ca/gotw/071.htm 但不一样:在Sutter的书中,他回答了C类必须提供成员函数的问题.一个特定的签名,否则程序将无法编译.在我的问题中,我需要做一些事情,如果一个类有这个功能,否则做"其他".
boost :: serialization面临类似的问题,但我不喜欢他们采用的解决方案:模板函数默认调用具有特定签名的自由函数(您必须定义),除非您定义特定的成员函数(在他们的情况下"序列化",它采用给定类型的2个参数)与特定签名,否则将发生编译错误.那就是实现侵入式和非侵入式序列化.
我不喜欢这个解决方案有两个原因:
我需要为没有该成员函数的类定义自定义行为,并且我的实体位于不同的名称空间内(我不想覆盖在一个名称空间中定义的全局函数,而我在另一个名称空间中)
你能给我一个解决这个难题的提示吗?
有没有办法检查任意变量类型是否可迭代?
那么要检查它是否有索引元素,或者我可以实际循环它的孩子?(例如使用foreach?)
是否可以为此创建通用模板?
我在搜索时找到了其他编程语言的技巧.然而,仍然必须找到如何在C++中做到这一点.
例如,我有一个这样的函数,它使用基于 C++ 11 范围的循环语法:
void myFunc(const std::vector<char>& bytes) {
for (char b : bytes) {
// do something useful to every byte
}
}
Run Code Online (Sandbox Code Playgroud)
如何改变这个函数的声明,接受每一个合适的序列容器,即不仅std::vector<char>,而且std::array<char>,std::string等?
从我所学到的,基于范围的for循环依赖于 给定的存在begin()和end()方法range_expression.通常,在其他语言中,这意味着所有可迭代容器共享某种通用接口,可用于为此类参数传递任意容器,但看起来C++没有任何类似的容器层次结构.相反,C++似乎有"概念",比如容器,但它只能在编译器内部访问,我猜?
c++ ×4
c++11 ×2
templates ×2
arrays ×1
containers ×1
iterable ×1
pretty-print ×1
sfinae ×1
stl ×1