C++有一个自由函数`size(object)`吗?

Fee*_*eek 11 c++ non-member-functions visual-studio-2015 c++17

似乎大多数人找到a的大小的方式string是他们只是使用它my_string.size()并且它工作正常.好吧,我最近做了一个班级任务,我做了......

if (size(my_string) < 5)
    store[counter].setWeight(stoi(my_string));
Run Code Online (Sandbox Code Playgroud)

代替....

if (my_string.size() < 5)
    store[counter].setWeight(stoi(my_string));
Run Code Online (Sandbox Code Playgroud)

但令我惊讶的是,我的导师,我相信他正在运行一个较旧的编译器,但却无法运行那行代码.在我的编译器上它可以双向工作,我不太清楚为什么.

一个完整的程序(两个输出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;
}
Run Code Online (Sandbox Code Playgroud)

如果有人能够解释为什么我的问题解决方案在我的机器上工作而不是我的教授?另外,我目前正在运行VS2015.

Nat*_*ica 11

MSVS 2015具有size以xutility定义的函数

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

这是您致电时使用的功能

cout << "Using size(myvar) = " << size(myvar) << endl;
Run Code Online (Sandbox Code Playgroud)

这不是标准的C++ 11/14函数,不能在gccclang上运行

这篇文章在VS 2015 RTM的C++ 11/14/17特性中有详细介绍

  • 顺便说一句,甚至放弃`using namespace std;`([为什么“使用命名空间std;”被认为是不好的做法?](http://stackoverflow.com/questions/1452721/why-is-using-namespace-std -thinked-bad-practice)) 不会因为 [ADL](http://en.cppreference.com/w/cpp/language/adl) 而改变任何东西,因为 `std::string` 也在 `标准`。 (2认同)

Jon*_*Mee 11

size实际上是C++ 17的功能.真正的好处是类似的好处begin,并end从C++ 11.

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

所以,如果我有这样的模板化函数:

template <typename T>
auto foo(const T& bar) { return bar.size(); }
Run Code Online (Sandbox Code Playgroud)

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

template <typename T>
auto foo(const T& bar) { return size(bar); }
Run Code Online (Sandbox Code Playgroud)

它也可以与C风格的数组一起使用.我在这里添加了一个实例:http://melpon.org/wandbox/permlink/Rlpi5wueA14JOW2P

总之,size如果您拥有C++ 17或更高版本的支持,则应始终使用它,因为它将提高跨容器和数组类型的可重用性.

  • 在C++中,参见\ [basic.start.main \]("*main中的return语句具有离开main函数的效果(销毁具有自动存储持续时间的任何对象)并以返回值作为参数调用std :: exit如果控件到达main的末尾而没有遇到return语句,则效果是执行return 0;*"). (4认同)