C++是否有一个自由函数“size(object)”



似乎大多数人找到string大小的方法是,他们只使用my_string.size(),它工作得很好。嗯,我最近做了一个课堂作业,我做了。。。

if (size(my_string) < 5)
    store[counter].setWeight(stoi(my_string));

而不是。。。。

if (my_string.size() < 5)
    store[counter].setWeight(stoi(my_string));

但令我惊讶的是,我的导师,我相信他正在运行一个旧的编译器,却没能运行那行代码。在我的编译器上,它是双向工作的,我不太确定为什么。

一个完整的程序(两者都输出4):

#include <string>
#include <iostream>
using namespace std;
int main()
{
    string myvar = "1000";
    cout << "Using size(myvar) = " << size(myvar) << endl;
    cout << "Using myvar.size() = " << myvar.size() << endl;
}

如果有人能解释为什么我的问题解决方案在我的机器上有效,而在我的教授身上无效?此外,我目前正在运行VS2015。

size实际上是C++17的功能。对的实际好处类似于C++11中beginend的好处。

注意,size的第一个定义只是返回容器的size方法。

因此,如果我有一个模板化的函数,比如:

template <typename T>
auto foo(const T& bar) { return bar.size(); }

这只能用于容器,但如果我将其更改为:

template <typename T>
auto foo(const T& bar) { return size(bar); }

它也可以与C样式数组一起使用。我在这里添加了一个实际示例:http://melpon.org/wandbox/permlink/Rlpi5wueA14JOW2P

总之,由于通用性和容器不可知代码的改进,您应该始终使用size和其他基于范围的函数(请参阅此处了解更多信息)

MSVS 2015在xutility 中定义了size函数

template<class _Container>
auto inline size(const _Container& _Cont)
    -> decltype(_Cont.size())
{   // get size() for container
return (_Cont.size());
}

这是您调用时使用的功能

cout << "Using size(myvar) = " << size(myvar) << endl;

这不是标准的C++11/14函数,不会在gcc或clang 上运行

这在博客文章C++11/14/17 VS 2015 RTM 中的功能中有详细介绍

根据http://blogs.msdn.com/b/vcblog/archive/2015/06/19/c-11-14-17-features-in-vs-2015-rtm.aspxVS2015开始支持非成员size n4280提案。

这有点奇怪,他们开箱即用,没有任何定义或编译器标志。但它看起来是这样的。目前它可能被认为是非标准的,尽管它已经被投票支持c++17。

最新更新