HLFX.Ru Forum Страницы (9): « 1 [2] 3 4 5 6 » ... Последняя »
Показать все 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)


Отправлено thambs 23-12-2017 в 00:58:

XaeroX
Т.е. функцию вроде-как определили в локальном неймспэйсе класса, а она вылезла в глобальный? Вот этот момент какой-то странный, хоть и компилируется. Это точно не UB?

__________________
http://www.moddb.com/mods/monorail-quest


Отправлено XaeroX 23-12-2017 в 05:57:

thambs
Функция определена в глобальном неймспейсе.
Кажется, ты путаешь объявление и определение.

__________________

xaerox on Vivino


Отправлено nemyax 23-12-2017 в 08:15:

XaeroX
Такой вызов — единственная осмысленная вещь, которую можно сделать с этой объявленной функцией?

Кстати, в гецеце же вроде можно включить расширение, которое даёт вложенные функции.


Отправлено XaeroX 23-12-2017 в 09:46:

Цитата:
nemyax писал:
Такой вызов — единственная осмысленная вещь, которую можно сделать с этой объявленной функцией?

А что ещё можно сделать с функцией, кроме как вызвать?
Ну можешь адрес взять.

Цитата:
nemyax писал:
Кстати, в гецеце же вроде можно включить расширение, которое даёт вложенные функции.

Кошмар какой.
Это не нужно, т.к. есть лямбды.

__________________

xaerox on Vivino


Отправлено thambs 23-12-2017 в 11:48:

XaeroX
Так объявление в неймспэйсе класса, а определение в глобальном, вот это мне странно. Так ведь можно и в другом классе такую же функцию объявить и будет путанница или нет?

__________________
http://www.moddb.com/mods/monorail-quest


Отправлено a1batross 23-12-2017 в 12:12:

XaeroX даже если лябмд нет, можно объявлять, например, структуру со статическими методами прямо в теле. Но из двух кошмаров и лямбд, всё же лучше выбирать лямбды.


Отправлено Government-Man 23-12-2017 в 12:26:

Цитата:
thambs писал:
Так ведь можно и в другом классе такую же функцию объявить и будет путанница или нет?


Если ты будешь вызывать ее из этого же класса, то будет вызываться функция из класса.


Отправлено XaeroX 23-12-2017 в 12:30:

Цитата:
a1batross писал:
даже если лябмд нет, можно объявлять, например, структуру со статическими методами прямо в теле.

Ну можно, конечно, мы в детстве так развлекались.
Но это формально не вложенная функция.
Цитата:
thambs писал:
Так ведь можно и в другом классе такую же функцию объявить и будет путанница или нет?

А ты поэкспериментируй с typeid и увидишь, что у них разные сигнатуры будут.
Путаница может быть только с namespace. И здесь у плюсов весьма и весьма запутанные правила. Но они существуют.

__________________

xaerox on Vivino


Отправлено Дядя Миша 23-12-2017 в 13:45:

Цитата:
XaeroX писал:
Но это формально не вложенная функция.

Эй, чувак мы добавили возможность объявить функцию внутри функции, чтобы ты мог вызывать функцию прямо из функции!

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено thambs 10-05-2018 в 16:19:

А вот ещё вопрос про наследование возник внезапно.
Например, у меня есть базовый шаблонный класс

C++ Source Code:
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
};
внутри которого определены всякие полезные методы.
Я хочу отнаследоваться от него, прилинковав указатель shape к массиву:
C++ Source Code:
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
};
, однако, хотелось бы избавиться от лишнего присваивания и в явном виде "подменить" указатель на массив. Если я просто объявлю size_t shape[n], то в результате получу ещё одно поле с тем же именем, чего мне не нужно. Как сделать правильно?

__________________
http://www.moddb.com/mods/monorail-quest


Отправлено ComradeAndrew 10-05-2018 в 16:38:

Цитата:
thambs писал:
хотелось бы избавиться от лишнего присваивания и в явном виде "подменить" указатель на массив

Прямо переопределить не получится
https://stackoverflow.com/a/19290950/4109062


Отправлено thambs 10-05-2018 в 16:54:

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]; } };

Предполагается, что место под данные заранее аллокировано (где угодно, хоть на стеке, хоть в куче, хоть на gpu). Что бы это можно было удобно использовать и копировать, хочется сделать производный класс, который и сам обращается с внешним аллокатором, но вот аллокатить ещё и место под служебные данные совсем не хочется, логично было бы хранить offset и shape прямо в классе. Вот и думаю как лучше сделать.

ps: тег [/сср] корябает отступы

__________________
http://www.moddb.com/mods/monorail-quest


Отправлено thambs 11-05-2018 в 17:21:

Ага, разобрался. Сделал так:

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


Отправлено Дядя Миша 11-05-2018 в 21:35:

Как вы эти шаблоны делаете, я их боюсь до ужаса.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено XaeroX 12-05-2018 в 08:04:

Дядя Миша
Ну шаблоны - скорее исключение, чем правило. Их обычно не рекомендуют использовать там, где можно без них обойтись (то есть в 99% случаев). Для меня на работе протащить шаблон в master - это всегда праздник.

__________________

xaerox on Vivino


Временная зона GMT. Текущее время 02:40. Страницы (9): « 1 [2] 3 4 5 6 » ... Последняя »
Показать все 123 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024