Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сигнатура функции возвращающей ссылку на, массив константного размера. 
V
    Опции темы
boostcoder
Дата 13.1.2012, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



всем привет.

хочу заставить такой код работать:
Код

#include <iostream>

template<typename T, std::uint32_t N>
const T(&)[N] get_arr(const T(&arr)[N]) {
   return arr;
}

int main() {
   std::cout << get_arr("1234") << std::endl;
}


http://liveworkspace.org/code/4513b0bb4013...e50f1ffb9eb09bf

по компилятор говорит это:
Цитата

Compilation finished with errors:
source.cpp:4:10: error: expected unqualified-id before ')' token
source.cpp:4:15: error: expected initializer before 'get_arr'
source.cpp: In function 'int main()':
source.cpp:9:31: error: 'get_arr' was not declared in this scope


методом тыка, перепробовал наверное все возможные и невозможные способы... %)

Добавлено через 2 минуты и 10 секунд
что-то мне подсказывает, что компилятору, в момент выведения типа и размера для возвращаемой ссылки на массив, T и N еще не известны.
PM WWW   Вверх
Alexeis
Дата 13.1.2012, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(boostcoder @  13.1.2012,  09:00 Найти цитируемый пост)
что-то мне подсказывает, что компилятору, в момент выведения типа и размера для возвращаемой ссылки на массив, T и N еще не известны. 

  Попробуй определить строку перед вызовом 
Код

char str[5] = "1234";
std::cout << get_arr(str) << std::endl;


Вот и узнаешь наверняка. Мне кажеться что компилятор не настолько умный что может извлечь N из размера массива.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
rumit7
Дата 13.1.2012, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 16.6.2011

Репутация: 6
Всего: 7



Цитата(boostcoder @ 13.1.2012,  08:00)
всем привет.

хочу заставить такой код работать:
Код

#include <iostream>

template<typename T, std::uint32_t N>
const T(&)[N] get_arr(const T(&arr)[N]) {
   return arr;
}

int main() {
   std::cout << get_arr("1234") << std::endl;
}



Так?

Код

#include <iostream>

template<typename T, std::uint32_t N>
const T (&get_arr(const T(&arr)[N]))[N] {
   return arr;
}

int main() {
   std::cout << get_arr("1234") << std::endl;
}


LWS
PM MAIL   Вверх
boostcoder
Дата 13.1.2012, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(Alexeis @  13.1.2012,  08:50 Найти цитируемый пост)
 Попробуй определить строку перед вызовом 

ошибка та же.


Цитата(Alexeis @  13.1.2012,  08:50 Найти цитируемый пост)
Мне кажеться что компилятор не настолько умный что может извлечь N из размера массива.

ну как же?! компилятор сам подсчитывает размер массива, если этот массив является constant expression:
Код

#include <iostream>

template<typename T, std::uint32_t N>
std::uint32_t get_arr(const T(&arr)[N]) {
   return N;
}

int main() {
   char arr[] = "1234";
   std::cout << get_arr(arr) << std::endl;
   std::cout << get_arr("12345") << std::endl;
}


http://liveworkspace.org/code/b42354114625...9adcbc0079f00e3

Добавлено @ 09:06
Цитата(rumit7 @  13.1.2012,  09:03 Найти цитируемый пост)
Так?

эм.. результат тот что нужно. вот только я не могу осилить выражение: const T (&get_arr(const T(&arr)[N]))[N]
 smile

Добавлено @ 09:08
о! еще один способ:
Код

#include <iostream>

template<typename T, std::uint32_t N>
auto get_arr(const T(&arr)[N]) -> const T(&)[N] {
   return arr;
}

int main() {
   char arr[] = "1234";
   std::cout << get_arr(arr) << std::endl;
}


http://liveworkspace.org/code/f7172896f4f4...27ee57186063755

эту сигнатуру я хоть понимаю smile

Это сообщение отредактировал(а) boostcoder - 13.1.2012, 09:09
PM WWW   Вверх
rumit7
Дата 13.1.2012, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 16.6.2011

Репутация: 6
Всего: 7



Цитата(boostcoder @ 13.1.2012,  09:05)
Цитата(rumit7 @  13.1.2012,  09:03 Найти цитируемый пост)
Так?

эм.. результат тот что нужно. вот только я не могу осилить выражение: const T (&get_arr(const T(&arr)[N]))[N]
 smile

 smile  согласен, не фонтан конеш..

Можно попробовать вот эту статью Reading C type declarations, после нее как-то легче становится
PM MAIL   Вверх
boostcoder
Дата 15.1.2012, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



подниму-ка я тему.

пытаюсь создать аргумент в этой функции, для того чтоб его вернуть и нее.
Код

template<typename T, int N>
constexpr auto sort(const T(&src)[N])-> const T(&)[N] {
   return src;
}

int main() {
   int src[] = {1,2,4,5,6,54,43,3,4,5,6,7,8,8,7,8,9,7,65,4,4,3,3,4,5,6,7,7,65,54};
   sort(src);
}

с этим кодом все ок.

теперь пробую сделать как-то так:
Код

template<typename T, int N>
constexpr auto sort(const T(&src)[N], T dst[N] = как его инициализировать по умолчанию? )-> const T(&)[N] {
   return dst;
}

int main() {
   int src[] = {1,2,4,5,6,54,43,3,4,5,6,7,8,8,7,8,9,7,65,4,4,3,3,4,5,6,7,7,65,54};
   sort(src);
}

http://liveworkspace.org/code/c1fb6b4da2a9...6e4606c891f323e

но мне тут не понятны два момента:
1. каким должен быть возвращаемый тип?
2. как инициализировать dst значением по умолчанию?

спасибо.

зы
да, compile-time сортировка ;)

зызы
обновил последний пример.

Это сообщение отредактировал(а) boostcoder - 15.1.2012, 10:15
PM WWW   Вверх
volatile
Дата 15.1.2012, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(boostcoder @  15.1.2012,  09:38 Найти цитируемый пост)
как инициализировать dst значением по умолчанию?

А какое должно быть значение по умолчанию-то?

PM MAIL   Вверх
boostcoder
Дата 15.1.2012, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



любое.
из-за того что constexpr функция должна выражаться как "{ return expr; }", я не могу в функции что либо задекларить. по этому я и хочу в качестве временного массива использовать второй аргумент, который будет массивом тех же типов и того же размера, но не ссылкой.

Это сообщение отредактировал(а) boostcoder - 15.1.2012, 11:51
PM WWW   Вверх
volatile
Дата 15.1.2012, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



со ссылкой это будет как-то так:
http://liveworkspace.org/code/a3acfb609622...39cf0cb248eb0f0

Цитата(boostcoder @  15.1.2012,  11:43 Найти цитируемый пост)
второй аргумент, который будет массивом тех же типов и того же размера, но не ссылкой.

в С/C++ вообще нельзя передать в функцию массив, и в данном случае 
Цитата(boostcoder @  15.1.2012,  09:38 Найти цитируемый пост)
constexpr auto sort(const T(&src)[N], T dst[N] 

вы передаете просто указатель.

ну в конце концев, если низя никак на вход ссылку (почему?), то так:
http://liveworkspace.org/code/4e603e37aedf...d9366d2d76bae6d

PM MAIL   Вверх
boostcoder
Дата 15.1.2012, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(volatile @  15.1.2012,  12:09 Найти цитируемый пост)
в данном случае вы передаете просто указатель.

ну да... ссылка на массив - это другое...

Цитата(volatile @  15.1.2012,  12:09 Найти цитируемый пост)
(почему?)

внутри sort(), я собираюсь модифицировать dst. т.е. результат сортировки поместить в него. и вернуть его.
а, т.к. мне нужно его модифицировать, он не должен быть константным. а неконстантную ссылку нельзя инициализировать временным значением.
PM WWW   Вверх
mes
Дата 15.1.2012, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  15.1.2012,  11:37 Найти цитируемый пост)
а, т.к. мне нужно его модифицировать, он не должен быть константным. а неконстантную ссылку нельзя инициализировать временным значением. 

а второй аргумент не будет временным ?!  которым вы будете инициализировать возвращаемую ссылку ??

Добавлено через 2 минуты и 29 секунд
я, так понимаю, Вы хотите, имея некий литерал, автоматически получить память, и вернуть ее ссылкой - это противоречит логике.. 
прежде чем делать на массивах попробовали свою композицию на инте smile

Добавлено через 3 минуты и 5 секунд
P.S. естественно речь о const_expr функции..

Добавлено через 4 минуты и 24 секунды
т.е. если хотите куда то отсортировать, вы должны завести для этого память.. 

вообщем начинать надо сформулировки задачи, а не с попытки найти лазейку... 



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 15.1.2012, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  15.1.2012,  13:01 Найти цитируемый пост)
а второй аргумент не будет временным ?

будет. но он валиден пока я в функции. это мне и надо. а возвращая его из функции, я получу копию. (я так понимаю..)

Цитата(mes @  15.1.2012,  13:01 Найти цитируемый пост)
которым вы будете инициализировать возвращаемую ссылку ?

не. возвращать нужно копию массива.

Цитата(mes @  15.1.2012,  13:01 Найти цитируемый пост)
прежде чем делать на массивах попробовали свою композицию на инте

вот, пробовал. надоело хеши считать. хочу сортировку! smile 
PM WWW   Вверх
mes
Дата 15.1.2012, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  15.1.2012,  12:09 Найти цитируемый пост)
я получу копию. (я так понимаю..)

как вы получите копию, если возвращаемоe является ссылкой  ?

Цитата(boostcoder @  15.1.2012,  12:09 Найти цитируемый пост)
не. возвращать нужно копию массива.

может тогда std::array прикрутить ?




--------------------
PM MAIL WWW   Вверх
rumit7
Дата 15.1.2012, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 16.6.2011

Репутация: 6
Всего: 7



Цитата(boostcoder @ 15.1.2012,  09:38)
подниму-ка я тему.

пытаюсь создать аргумент в этой функции, для того чтоб его вернуть и нее.
...
теперь пробую сделать как-то так:
Код

template<typename T, int N>
constexpr auto sort(const T(&src)[N], T dst[N] = как его инициализировать по умолчанию? )-> const T(&)[N] {
   return dst;
}

int main() {
   int src[] = {1,2,4,5,6,54,43,3,4,5,6,7,8,8,7,8,9,7,65,4,4,3,3,4,5,6,7,7,65,54};
   sort(src);
}


но мне тут не понятны два момента:
1. каким должен быть возвращаемый тип?
2. как инициализировать dst значением по умолчанию?

спасибо.

зы
да, compile-time сортировка ;)

зызы
обновил последний пример.

А что если так?
Код

template<class T, int N>
struct array_holder
{
   static 
   T arr[N];
};

template<class T, int N>
T array_holder<T,N>::arr[N];

template<class T, int N>
constexpr auto sort(const T(&src)[N], T (&dst)[N] = array_holder<T,N>::arr )-> T(&)[N] {
   return dst;
}

int main() {
   int src[] = {1,2,4,5,6,54,43,3,4,5,6,7,8,8,7,8,9,7,65,4,4,3,3,4,5,6,7,7,65,54};
   sort(src);
}


Правда все равно не понятно, как Вы будите сортировать?!
PM MAIL   Вверх
mes
Дата 15.1.2012, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(rumit7 @  15.1.2012,  13:58 Найти цитируемый пост)
Правда все равно не понятно, как Вы будите сортировать?! 

есть размер (N) значит можно организовать цикл (рекурсивный) , к значениям можно применить мин, и есть место куда сложить результат - значит и отсортировать можно smile



--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1163 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.