Visual Studio 2015 — Есть ли в 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.

11

Решение

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;

Это не стандартная функция C ++ 11/14 и не будет работать на НКУ или же лязг

Это было подробно описано в блоге Особенности C ++ 11/14/17 в VS 2015 RTM

11

Другие решения

size на самом деле функциональность C ++ 17. Реальная выгода сродни пользе begin а также end из C ++ 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 если у вас есть поддержка C ++ 17 или лучше, потому что это улучшит возможность повторного использования в контейнерах и массивах.

11

В соответствии с http://blogs.msdn.com/b/vcblog/archive/2015/06/19/c-11-14-17-features-in-vs-2015-rtm.aspx VS2015 начал поддерживать не членов size n4280 предложение.

Странно, что они включают это без каких-либо настроек без какого-либо флага определения или компилятора. Но похоже это так. В настоящее время это может считаться нестандартным, хотя за него уже проголосовали за c ++ 17.

3
По вопросам рекламы [email protected]