C++ 有自由函数 size(object) 吗?
Does C++ have a free function `size(object)`?
似乎大多数人找到 string
大小的方法是他们只是使用 my_string.size()
并且它工作正常。好吧,我最近为 class 做了一个作业,我在那里...
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。
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 or clang
这在博客中有详细说明 post C++11/14/17 Features In VS 2015 RTM
根据http://blogs.msdn.com/b/vcblog/archive/2015/06/19/c-11-14-17-features-in-vs-2015-rtm.aspx VS2015 started to support non-member size
n4280提议。
他们在没有任何定义或编译器标志的情况下开箱即用,这有点奇怪。不过好像是。目前它可能被认为是非标准的,尽管它已经被投票支持 c++17。
size
is actually C++17 functionality. The real benefit to is akin to the benefit of begin
and end
来自 C++11。
请注意 size
的第一个定义只是 returns 容器的大小方法。
所以如果我有这样的模板化函数:
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
和其他基于范围的函数,因为通用性和容器不可知代码得到了改进(有关更多信息,请参见 here)。
似乎大多数人找到 string
大小的方法是他们只是使用 my_string.size()
并且它工作正常。好吧,我最近为 class 做了一个作业,我在那里...
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。
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 or clang
这在博客中有详细说明 post C++11/14/17 Features In VS 2015 RTM
根据http://blogs.msdn.com/b/vcblog/archive/2015/06/19/c-11-14-17-features-in-vs-2015-rtm.aspx VS2015 started to support non-member size
n4280提议。
他们在没有任何定义或编译器标志的情况下开箱即用,这有点奇怪。不过好像是。目前它可能被认为是非标准的,尽管它已经被投票支持 c++17。
size
is actually C++17 functionality. The real benefit to is akin to the benefit of begin
and end
来自 C++11。
请注意 size
的第一个定义只是 returns 容器的大小方法。
所以如果我有这样的模板化函数:
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
和其他基于范围的函数,因为通用性和容器不可知代码得到了改进(有关更多信息,请参见 here)。