c ++ 11 не может использовать auto
вычет типа возврата.
Для c ++ 14 , читая ваши мысли, вы портировали это:
inline unsigned long int determineFirstPosition(const std::string s)
{
for (unsigned long int i = 0; i < s.length(); ++i)
{
switch (s.at(i))
{
case ' ':
{
break;
}
default:
{
return i;
}
}
}
return s.length();
}
до
inline auto determineFirstPosition(const std::string s)
{
for (auto i = 0; i < s.length(); ++i)
{
switch (s.at(i))
{
case ' ':
{
break;
}
default:
{
return i;
}
}
}
return s.length();
}
в этом случае ваша ошибка была
for (auto i = 0; i < s.length(); ++i)
, потому что auto i = 0
- это int
, а не тип s.length()
.
Выполните
for (decltype(s.length()) i = 0; i < s.length(); ++i)
, если вы хотите избежать именования типов здесь.
В качестве альтернативы, вы можете использовать std::string::size_type
.В качестве альтернативы вы можете написать утилиту, которая позволит вам for(:)
превышать индексы во что-то;
template<class T> struct tag_t {using type=T;};
template<class X> using block_deduction = typename tag_t<X>::type;
template<class It>
struct range_t {
It b, e;
It begin() const { return b; }
It end() const { return e; }
};
template<class S>
struct indexer_t {
S s;
void operator++(){++s;}
S operator*() const{ return s; }
friend bool operator==( indexer_t const& lhs, indexer_t const& rhs ) {
return lhs.s == rhs.s;
}
friend bool operator!=( indexer_t const& lhs, indexer_t const& rhs ) {
return lhs.s != rhs.s;
}
};
template<class S>
range_t<indexer_t<S>> indexes( block_deduction<S> start, S finish ) {
return {{std::move(start)}, {std::move(finish)}};
}
template<class C>
auto indexes_into( C&& c ) {
return indexes( 0, c.size() );
}
, что позволяет вам делать:
for( auto i : indexs_into(s) )
вместо
for (unsigned long int i = 0; i < s.length(); ++i)
Живой пример .
(в качестве дополнительного бонуса,
template<class C>
auto iterators_into( C& c ) {
return indexes( c.begin(), c.end() );
}
также полезен, позволяя вам перебирать все действительные итераторы в контейнер без необходимости вручнуюнаписание for(;;)
петли)