Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, emergen, Вы писали:
E>>Добрый день! Подскажите пожалуйста можно ли средствами с++ сделать конструкцию подобную языку Python?
J>ну это просто массив из std::tuple<int,int> будет, а так все то же самое.
А если вместо второго аргумента поставить указатели на объект типа
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, emergen, Вы писали:
E>>Добрый день! Подскажите пожалуйста можно ли средствами с++ сделать конструкцию подобную языку Python?
J>ну это просто массив из std::tuple<int,int> будет, а так все то же самое.
offtopic: А вообще из рсдн неплохой транлятор из питона в с++ может получится (и не только)
Здравствуйте, kvser, Вы писали:
K>Здравствуйте, jazzer, Вы писали:
J>>Здравствуйте, emergen, Вы писали:
E>>>Добрый день! Подскажите пожалуйста можно ли средствами с++ сделать конструкцию подобную языку Python?
J>>ну это просто массив из std::tuple<int,int> будет, а так все то же самое.
K>offtopic: А вообще из рсдн неплохой транлятор из питона в с++ может получится (и не только)
заинтересовала конструкция цикла! просто и удобно, вот хочу понять может ли С++11 такое сделать...
Здравствуйте, Igore, Вы писали:
I>Здравствуйте, emergen, Вы писали:
E>>А если вместо второго аргумента поставить указатели на объект типа E>>как в таком случае будет выглядеть цикл?
I>Точно так же: I>
I>struct Test
I>{
I> int i;
I>};
I>std::vector< std::tuple< int, Test* > > vec1;
I>for( auto& it : vec1 )
I>{
I> std::get< 1 >( it )->i = std::get< 0 >( it );
I> //Или так
I> int index;
I> Test* pointer;
I> std::tie( index, pointer) = it;
I> pointer->i = index;
I>}
I>//Если использовать pair то можно так
I>std::vector< std::pair< int, Test* > > vec2;
I>for( auto& it : vec2 )
I>{
I> it.second->i = it.first;
I>}
I>
я так понял что std::tuple плох тем что нельзя явно (статически) задать значения и размер массива
т.е. нельзя написать std::tuple<int, MyObject(), 3 > = { (1, .. ), (3, .. ), (3, .. )}
Меня всегда интересовало, зачем tuple в нешаблонном коде. Имхо, значительно яснее сделать доп стуктуру
I>Точно так же: I>
I>struct Test
I>{
I> int i;
I>};
struct SomeUsefullStruct
{
int index;
Test *pointer;
};
std::vector<SomeRealName> vec1;
I>for( auto& it : vec1 )
I>{
it.pointer->f(it.index);
I>}
I>
Объем тот же (если сравнить с вариантом int index; Test* pointer; std::tie( index, pointer) = it
Работает автокомплит, не надо вспоминать, какой член где лежит.
Если вдруг имена поменяются — будет ошибка компиляции.
Легко найти все использования.
Единственный минус — надо явно объявить структуру и дать нормальные имена.
Здравствуйте, emergen, Вы писали:
E>я так понял что std::tuple плох тем что нельзя явно (статически) задать значения и размер массива E>т.е. нельзя написать std::tuple<int, MyObject(), 3 > = { (1, .. ), (3, .. ), (3, .. )}
Но если у тебя предыдущая задача и уже есть массив объектов (или указателей на) MyObject, и тебе нужно их просто пересчитать, то проще пересчитать напрямую, а не городить еще один массив со счетчиками.
В С++, в отличие от управляемых языков типа Питона (в которых, к тому же, в основном ссылки-указатели летают), стараются лишних объектов не плодить.
Здравствуйте, emergen, Вы писали:
E>Здравствуйте, Igore, Вы писали:
E>я так понял что std::tuple плох тем что нельзя явно (статически) задать значения и размер массива E>т.е. нельзя написать std::tuple<int, MyObject(), 3 > = { (1, .. ), (3, .. ), (3, .. )}
std::tuple это кортеж а не массив, тебе нужен std::vector< std::tuple<int, MyObject > > или std::array< std::tuple<int, MyObject >, 3 >
python [(0, 23), (1, 12), (2, 41), (3, 10)], в С++ переходит в масив кортежей, std::vector< std::tuple< int, int > >;
В С++ ты не можешь распаковать кортеж прямо в for или range based for, лишнии строчти по сравнению с python-ом будут в любом случае.
P.S.
Так делать нельзя, но мой мозг выдал распоковку прямов в for
for( std::size_t i = 0; ( i < vec1.size() ? std::tie( index, pointer ) = vec1[ i ], true : false ); ++i )
{
pointer->i = index;
}
Здравствуйте, enji, Вы писали:
E>Меня всегда интересовало, зачем tuple в нешаблонном коде. Имхо, значительно яснее сделать доп стуктуру E>Единственный минус — надо явно объявить структуру и дать нормальные имена.
+1. Кстати, я в питоне тоже почти все время namedtuple использую.
, сам предпочитаю структуры.
Хотя у tuple (или boost::fusion в более общем смысле) в нешаблонном коде всё же есть преимущества, например "автоматическое" лексикографическое сравнение — и прочие гетерогенные радости. Появление compile-time reflection конечно изменит ситуацию.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Появление compile-time reflection конечно изменит ситуацию.
а есть уже какие-то подвижки в эту сторону? В идеале хотелось бы компайл-тайм макросов (с циклами, переменными и всем прочим), в которых можно добраться до синтаксического дерева
Здравствуйте, enji, Вы писали:
E>Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>>Появление compile-time reflection конечно изменит ситуацию.
E>а есть уже какие-то подвижки в эту сторону? В идеале хотелось бы компайл-тайм макросов (с циклами, переменными и всем прочим), в которых можно добраться до синтаксического дерева
Здравствуйте, enji, Вы писали:
EP>>Появление compile-time reflection конечно изменит ситуацию. E>а есть уже какие-то подвижки в эту сторону? В идеале хотелось бы компайл-тайм макросов (с циклами, переменными и всем прочим),
Там разные предложения были, и reflection структур, и улучшенные макросы.
Я бы предпочёл сначала получить reflection структур (а-ля BOOST_FUSION_ADAPT_*), потом возможность создавать новые структуры через мета-программирование (например на входе struct In { int x; };, на выходе struct Out { int &x; };), а уж потом всё остальное.
E>в которых можно добраться до синтаксического дерева
Насчёт доступа к синтаксическому дереву сомневаюсь — это же его нужно всё стандартизировать. AFAIK, внутри MSC++ до недавнего времени вообще не было AST
А вот что-то типа квази-цитирования, как в Nemerle — думаю возможно.