Имеет ли С++ свободную функцию `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.