Как создать красивые кнопки на iOS? [закрыто]

На самом деле, в C ++ 14 это можно сделать с очень небольшим количеством строк кода.

Это очень похоже на идею решения @ Paul. Из-за недостатков в C ++ 11 это решение немного излишне раздувается (плюс определение в std-запахах). Благодаря C ++ 14 мы можем сделать его более читаемым.

Главное наблюдение заключается в том, что для циклов на основе диапазона используются, полагаясь на begin() и end(), чтобы получить диапазон итераторы. Благодаря ADL , даже не нужно определять свои пользовательские begin() и end() в пространстве имен std ::

. Это очень простое примерное решение :

// -------------------------------------------------------------------
// --- Reversed iterable

template 
struct reversion_wrapper { T& iterable; };

template 
auto begin (reversion_wrapper w) { return std::rbegin(w.iterable); }

template 
auto end (reversion_wrapper w) { return std::rend(w.iterable); }

template 
reversion_wrapper reverse (T&& iterable) { return { iterable }; }

Это работает как шарм, например:

template 
void print_iterable (std::ostream& out, const T& iterable)
{
    for (auto&& element: iterable)
        out << element << ',';
    out << '\n';
}

int main (int, char**)
{
    using namespace std;

    // on prvalues
    print_iterable(cout, reverse(initializer_list { 1, 2, 3, 4, }));

    // on const lvalue references
    const list ints_list { 1, 2, 3, 4, };
    for (auto&& el: reverse(ints_list))
        cout << el << ',';
    cout << '\n';

    // on mutable lvalue references
    vector ints_vec { 0, 0, 0, 0, };
    size_t i = 0;
    for (int& el: reverse(ints_vec))
        el += i++;
    print_iterable(cout, ints_vec);
    print_iterable(cout, reverse(ints_vec));

    return 0;
}

печатает как ожидалось

4,3,2,1,
4,3,2,1,
3,2,1,0,
0,1,2,3,

ПРИМЕЧАНИЕ std::rbegin(), std::rend() и std::make_reverse_iterator() еще не реализованы в GCC-4.9. Я пишу эти примеры в соответствии со стандартом, но они не будут компилироваться в стабильном g ++. Тем не менее, добавление временных заглушек для этих трех функций очень просто. Вот пример реализации, определенно не полный , но достаточно хорошо работает для большинства случаев:

// --------------------------------------------------
template 
reverse_iterator make_reverse_iterator (I i)
{
    return std::reverse_iterator { i };
}

// --------------------------------------------------
template 
auto rbegin (T& iterable)
{
    return make_reverse_iterator(iterable.end());
}

template 
auto rend (T& iterable)
{
    return make_reverse_iterator(iterable.begin());
}

// const container variants

template 
auto rbegin (const T& iterable)
{
    return make_reverse_iterator(iterable.end());
}

template 
auto rend (const T& iterable)
{
    return make_reverse_iterator(iterable.begin());
}

UPDATE 22 Oct 2017

Благодаря estan для указания этого.

В исходной реализации выборки ответов используется using namespace std;, что приведет к тому, что любой файл, включая эту реализацию (который должен находиться в файле заголовка), также импортирует целое std.

Исправлена ​​реализация примера, чтобы предложить using std::rbegin, std::rend.

16
задан eemceebee 11 February 2011 в 08:22
поделиться