Страницы (3): [1] 2 3 » Показать все 123 сообщений этой темы на одной странице |
HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Технические вопросы (https://hlfx.ru/forum/forumdisplay.php?forumid=20)
-- нубовопросы по c++ (https://hlfx.ru/forum/showthread.php?threadid=5083)
нубовопросы по c++
Неожиданно, возник вопрос про конструкторы по умолчанию. Например, есть структура
1 | struct foo{ |
2 | foo(){} |
3 | foo(int...){} |
4 | }; |
5 | int main () { |
6 | foo x; |
7 | foo y(); |
8 | foo z(1); |
9 | cout<<typeid(x).name()<<endl; |
10 | cout<<typeid(y).name()<<endl; |
11 | cout<<typeid(z).name()<<endl; |
12 | return 0; |
__________________
http://www.moddb.com/mods/monorail-quest
Тип foo() - это функция, возвращающая foo и не принимающая никаких аргументов. Ты же сам её объявил, смотри:
foo x; // создание экземпляра класса foo с вызовом конструктора по умолчанию |
foo y(); // объявление функции y, которая возвращает foo |
foo z(1); // создание экземпляра класса foo с вызовом конструктора foo(int) |
__________________
>это функция
действительно. что-то сразу не распарсил.
__________________
http://www.moddb.com/mods/monorail-quest
foo y(); // объявление функции y, которая возвращает foo |
А в новых стандартах C++ вот так
std::vector< std::pair< vec_t, int >> foo; |
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Дядя Миша
В смысле STL-контейнер в STL-контейнере? Я юзал и мысли не было, что так нельзя. Студия 2015 хавала.
std::map<HCP*, std::set<HCP*>> slu; |
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
>foo y(); // объявление функции y, которая возвращает foo
А не, всё равно не распарсил, это же nested-функция получается а они в стандарте запрещены.
__________________
http://www.moddb.com/mods/monorail-quest
thambs
Объявить дадут, а определить нет.
Да, объявлять функции внутри функций вполне можно.
Вот тебе конкретный пример, где это необходимо:
1 | class Bar |
2 | { |
3 | public: |
4 | Bar() = default; |
5 | void Foo(); |
6 | }; |
7 |
8 | void Bar::Foo() |
9 | { |
10 | Bar foo(); // <---- это не создание объекта класса Bar, но эта строка нужна! |
11 | foo(); |
12 | std::cout << "Bar"; |
13 | } |
14 |
15 | Bar foo() |
16 | { |
17 | std::cout << "Foo"; |
18 | return Bar(); |
19 | } |
20 |
21 | int main(int argc, char *argv[]) |
22 | { |
23 | Bar bar; |
24 | bar.Foo(); |
25 | } |
std::vector<std::vector<std::vector<std::pair<int,int>>>> v; |
__________________
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Дядя Миша
Ошибка была только в компиляторе MSVC, она давно исправлена, да.
__________________
XaeroX ну что же. Для шестой студии статьи Борескова всё еще актуальны
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Дядя Миша
Шестая студия - это легенда, о которой рассказывают седые старики. Ну примерно как о том, как видели живого нациста.
__________________
XaeroX как у МаркТвена было написано в каком-то из рассказов, юзая шестую студию, я внезапно начал ощущать дружеские чувства к мумии фараона и желание поболтать с ним на злободневные темы.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
XaeroX
Т.е. функцию вроде-как определили в локальном неймспэйсе класса, а она вылезла в глобальный? Вот этот момент какой-то странный, хоть и компилируется. Это точно не UB?
__________________
http://www.moddb.com/mods/monorail-quest
thambs
Функция определена в глобальном неймспейсе.
Кажется, ты путаешь объявление и определение.
__________________
XaeroX
Такой вызов — единственная осмысленная вещь, которую можно сделать с этой объявленной функцией?
Кстати, в гецеце же вроде можно включить расширение, которое даёт вложенные функции.
__________________
XaeroX
Так объявление в неймспэйсе класса, а определение в глобальном, вот это мне странно. Так ведь можно и в другом классе такую же функцию объявить и будет путанница или нет?
__________________
http://www.moddb.com/mods/monorail-quest
XaeroX даже если лябмд нет, можно объявлять, например, структуру со статическими методами прямо в теле. Но из двух кошмаров и лямбд, всё же лучше выбирать лямбды.
__________________
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
А вот ещё вопрос про наследование возник внезапно.
Например, у меня есть базовый шаблонный класс
1 | template <typename t, size_t n> |
2 | struct base{ |
3 | t* data; |
4 | size_t* shape; |
5 | base<t, dim>(t* data, size_t* shape): |
6 | data(data), shape(shape){} |
7 | ... |
8 | }; |
1 | template <typename t, size_t n> |
2 | struct derived: base<t, n>{ |
3 | size_t _shape[n]; |
4 | derived<t, dim>(){ |
5 | this->data = nullptr; //кстати, почему здесь нужно обращаться к this? |
6 | this->shape = _shape; |
7 | }; |
8 | ... |
9 | }; |
__________________
http://www.moddb.com/mods/monorail-quest
ComradeAndrew
Хмм, а как тогда лучше перестроить иерархию классов?
Конкретно, у меня такой вариант морды, для доступа к многомерному массиву:
code:
template <typename t, size_t dim> struct carray_base{ t* data; size_t* offset; size_t* shape; carray_base<t, dim>(t* data, size_t* shape, size_t* offset): data(data), shape(shape), offset(offset) {} inline size_t size(void)const{ return shape[0]*offset[0]; } template <typename num, size_t d = dim, typename enable_if<(d > 1), size_t>::type = 0> inline carray_base<t, dim-1> operator [] (num i){ return carray_base<t, dim-1>(data + (size_t)i*offset[0], shape+1, offset+1); } template <typename num, size_t d = dim, typename enable_if<(d == 1), size_t>::type = 0> inline t& operator [] (num i) { return data[(size_t)i]; } };
__________________
http://www.moddb.com/mods/monorail-quest
Ага, разобрался. Сделал так:
code:
template <typename t, size_t dim, bool proxy> struct carray_base{ static_assert(dim>0, ""); typedef typename conditional<proxy, size_t*, size_t[dim]>::type id; t* data; id offset; id shape; ... }; template <typename t, size_t dim> struct carray: carray_base<t, dim, false>{ ... };
__________________
http://www.moddb.com/mods/monorail-quest
Как вы эти шаблоны делаете, я их боюсь до ужаса.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Дядя Миша
Ну шаблоны - скорее исключение, чем правило. Их обычно не рекомендуют использовать там, где можно без них обойтись (то есть в 99% случаев). Для меня на работе протащить шаблон в master - это всегда праздник.
__________________
Ага, а в 17м стандарте можно наконец-то сделать по человечески:
code:
typedef typename conditional <(dim>1), carray_base<t, dim-1, true>, t&>::type out; template <typename num> //c++17 inline out operator [] (const num& i){ if constexpr (dim>1){ return out(data + (size_t)i*offset[0], shape+1, offset+1); } else { return data[(size_t)i]; } }
__________________
http://www.moddb.com/mods/monorail-quest
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
__________________
Извиняюсь ещё раз за поднятие темы, но есть ли разница между приведением типов
и (вызовом конструктора?)code:
(int)(x)
?code:
int(x)
__________________
http://www.moddb.com/mods/monorail-quest
thambs никакой.
__________________
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Вот и у меня созрел вопрос по С++. Атомарный тип half в язык добавят когда-нибудь уже наконец.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Дядя Миша
Вряд ли. Минимальный размер выделяемой памяти - байт. А битовые поля и так есть https://en.cppreference.com/w/cpp/language/bit_field
А насчет "атомарности", мне кажется тут некая путаница возникла. Фундаментальные типы не являются атомарными - https://stackoverflow.com/questions...al-types-atomic
ComradeAndrew ты точно понял мой вопрос?
Добавлено 06-06-2018 в 14:57:
half это вещественное с половинной точностью, два байта занимает.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Временная зона GMT. Текущее время 03:03. | Страницы (3): [1] 2 3 » Показать все 123 сообщений этой темы на одной странице |
На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024