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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> string hashing in compile-time, хеш 
V
    Опции темы
mes
Дата 13.2.2011, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



например отделить рантайм представление ид от типа ... 
http://liveworkspace.org/code/ac0bac3f7199...a8cefe173170975


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


pattern`щик
****


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

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



отвечу в нашей мегатеме.
а то к этой теме это отношения уже не имеет...
PM WWW   Вверх
boostcoder
Дата 13.2.2011, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(GoldFinch @  12.2.2011,  14:43 Найти цитируемый пост)
надо ждать constexpr

вы не могли бы показать пример этого? я что-то не въезжаю smile 
PM WWW   Вверх
GoldFinch
Дата 14.2.2011, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 15
Всего: 26



boostcoder, просто помечаете функцию как constexpr и она работает в compile-time
http://www.open-std.org/jtc1/sc22/wg21/doc.../2007/n2235.pdf
(на самом деле есть ограничения, впрочем всеравно надо ждать гцц4.6 чтобы проверить)

Это сообщение отредактировал(а) GoldFinch - 14.2.2011, 00:51
PM MAIL ICQ   Вверх
boostcoder
Дата 14.2.2011, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(GoldFinch @  14.2.2011,  00:48 Найти цитируемый пост)
просто помечаете функцию как constexpr и она работает в compile-time

про constexpr я понял.
я не помял что мне это даст.
Код

template<typename T>
struct type {
   template<typename R, typename Args...>
   void(R(T::*m)(const Args...), const char* id) { <<<<<<<<<<<<< ???
   }
};

как constexpr мне поможет использовать алгоритм mpl-hash в данном случае?

Добавлено через 1 минуту и 55 секунд
Цитата(GoldFinch @  14.2.2011,  00:48 Найти цитируемый пост)
всеравно надо ждать гцц4.6 чтобы проверить

я могу проверить и сейчас. знать бы что проверять.
PM WWW   Вверх
GoldFinch
Дата 14.2.2011, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 15
Всего: 26



сомнительное это дело, писать код вслепую %)

Добавлено через 5 минут и 4 секунды
вобщем циклов там нет, рекурсии нет.
зато там наверное можно сделать 
Код

constexpr f(int i) { return ("some string")[i]; }

если да - то это можно использовать в том макросе для хешей

Добавлено через 6 минут и 5 секунд
Цитата(boostcoder @  14.2.2011,  00:53 Найти цитируемый пост)
я могу проверить и сейчас. знать бы что проверять. 

работу со строковыми литералами надо проверять, что еще %)
PM MAIL ICQ   Вверх
mes
Дата 14.2.2011, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(GoldFinch @  13.2.2011,  23:56 Найти цитируемый пост)
, рекурсии нет.

а рекурсии почему нет то ?



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



****


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

Репутация: 15
Всего: 26



mes, потому что Струструп так сказал
Цитата

constexpr int fac(int x)
{ return x > 2 ? x * fac(x - 1) : 1; } // error: fac() not defined
// before use


We (still) prohibit recursion in all its form in constant expressions. That is not
strictly necessary because an implementation limit on recursion depth in constant
expression evaluation would save us from the possibility of the compiler recursing
forever. However, until we see a convincing use case for recursion, we don’t
propose to allow it.

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


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


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

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



Цитата(boostcoder @  13.2.2011,  23:53 Найти цитируемый пост)
 знать бы что проверять. 

ну вот это для начала :

Код

template <size_t N>
constexpr size_t test (char str[N])
{
   return N;
}
int a[test("string")];

int main () {
  std::cout << sizeof (a);
}


Это сообщение отредактировал(а) mes - 14.2.2011, 01:14


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


pattern`щик
****


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

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



Цитата(GoldFinch @  14.2.2011,  00:56 Найти цитируемый пост)
сомнительное это дело, писать код вслепую %) 

вы о том, что у вас нет gcc-4.6 ?
пожалуйста: rghost.ru/4342609
вчерашняя сборка из SVN.

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



****


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

Репутация: 15
Всего: 26



boostcoder, при проверках надо учитывать что constexpr код может быть и динамически выполняемым:
Цитата
A constant-expression constructor may be invoked with non-constant expression
arguments — the resulting initialization may then be dynamic.

массивы могут не подойти, т.к. может сработать расширение С99
лучше шаблоны или switch
Код

constexpr foo() { ... }
int main()
{
  switch(1)
 {
 case foo(): ;
 } 
}

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


pattern`щик
****


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

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



mes, сейчас проверю.
PM WWW   Вверх
GoldFinch
Дата 14.2.2011, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 15
Всего: 26



Цитата(boostcoder @  14.2.2011,  01:13 Найти цитируемый пост)
вы о том, что у вас нет gcc-4.6 ?

у меня никакого гцц нет)
ок, попробуем..
PM MAIL ICQ   Вверх
boostcoder
Дата 14.2.2011, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(boostcoder @  14.2.2011,  01:13 Найти цитируемый пост)
пожалуйста: rghost.ru/4342609
вчерашняя сборка из SVN.

забыл уточнить: это mingw.

Добавлено через 4 минуты и 45 секунд
mes, ваш код скомпилился только после такой поправки:
Код

#include <iostream>

template <size_t N>
constexpr size_t test(const char (&str)[N])
{
   return N;
}

int a[test("string")];

int main () {
  std::cout << sizeof (a);
}


результат - 28. правильно.

иначе такая ошибка:
Цитата

C:\>g++ -omain main.cpp -std=c++0x
main.cpp:8:20: error: no matching function for call to 'test(const char [7])'
main.cpp:8:20: note: candidate is:
main.cpp:4:40: note: template<unsigned int N> constexpr size_t test(const char*)

PM WWW   Вверх
GoldFinch
Дата 14.2.2011, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 15
Всего: 26



Код

template<long N>
constexpr long test(const char (&str)[N])
{
   return N;
}

template<long N> struct identity { static const long value = N; };

int main()
{
    return identity<test("123")>::value;
}

работает

Это сообщение отредактировал(а) GoldFinch - 14.2.2011, 01:30
PM MAIL ICQ   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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