Имеет ли С++ свободную функцию `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.
Ответы
Ответ 1
MSVS 2015 имеет функцию size
, определенную в xutility
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;
Это не стандартная функция С++ 11/14 и не будет работать на gcc или лязг
Это было подробно описано в сообщении в блоге С++ 11/14/17 Особенности В RTM версии VS 2015
Ответ 2
size
- фактически функциональность С++ 17. Реальная польза от этого схожа с выгодой begin
и end
из С++ 11.
Обратите внимание, что первое определение 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
, если у вас есть поддержка С++ 17 или лучше, потому что это улучшит повторное использование в типах контейнеров и массивов.
Ответ 3
Согласно http://blogs.msdn.com/b/vcblog/archive/2015/06/19/c-11-14-17-features-in-vs-2015-rtm.aspx VS2015 начал поддерживать не-член size
n4280.
Это странно, что они позволяют использовать его вне коробки с любым флагом определения или компилятора. Но похоже. В настоящее время он может считаться нестандартным, хотя он уже проголосовали за С++ 17.