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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> инстанцировать шаблон литералом 
:(
    Опции темы
GoldFinch
Дата 10.3.2009, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



возможно ли инстанцировать шаблон строковым литералом в каком-нибудь компиляторе, или единственный выход - цеплять свой препроцессор который менял бы "Abcd" на ченить типа 'A','b','c','d' ?
PM MAIL ICQ   Вверх
mes
Дата 11.3.2009, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Можно вместо строки  использовать int как 'ABCD'. Однако это  не стандартное средство.. у gcc  работает, а у VS неизвестно.


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Код

enum
{
    ABCD
};

template <int Val>
class MyClass;

template<>
class MyClass<ABCD>
{
....
};


Добавлено через 2 минуты и 39 секунд
в шаблон конечно-же можно передать указатель, но он должен быть известен на этапе компиляции, поэтому придется заранее создавать рад строковых констант, что в принципе то-же самое что и мой пример выше...
PM MAIL Skype GTalk   Вверх
GoldFinch
Дата 11.3.2009, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



вобщем я хочу сделать такую штуку чтобы конструкция
hash<"qwertyui">::ret
выдавала хеш "qwertyui"

идея с int хороша, но только разве что с __int128 а еще лучше с __int256
PM MAIL ICQ   Вверх
vinter
Дата 11.3.2009, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

Репутация: 13
Всего: 56



делай, это будет работать

Добавлено через 13 минут и 51 секунду
Цитата(GoldFinch @  11.3.2009,  00:08 Найти цитируемый пост)
возможно ли инстанцировать шаблон строковым литералом в каком-нибудь компиляторе

в любом

Это сообщение отредактировал(а) vinter - 11.3.2009, 09:27


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



****


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

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



vinter, и как же?
PM MAIL ICQ   Вверх
Lazin
Дата 11.3.2009, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(vinter @  11.3.2009,  09:16 Найти цитируемый пост)
делай, это будет работать

не будет
PM MAIL Skype GTalk   Вверх
GoldFinch
Дата 11.3.2009, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



с int все ок, а вот с __int64 не получается, видимо потому что конпелятор 32разрядный и такие "большие" константы он не переваривает
PM MAIL ICQ   Вверх
vinter
Дата 11.3.2009, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

Репутация: 13
Всего: 56



да, с классом я протупил. Можно сделать это ф-ией

Добавлено через 10 минут и 26 секунд
или вот так
Код

template <typename T = std::string>
struct A
{
    T str;
    A(T str_): str(str_)
    {}
    std::string operator()()
    {
        return str + " hash\n";
    }
};

int main()
{
    std::cout << A<>("Hash")();
    system ("pause");
}



--------------------
Мой блог
PM MAIL WWW   Вверх
GoldFinch
Дата 11.3.2009, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



vinter, надо во время компиляции
PM MAIL ICQ   Вверх
Lazin
Дата 11.3.2009, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(GoldFinch @  11.3.2009,  11:27 Найти цитируемый пост)
надо во время компиляции

а зачем? я usecase такого класса(ф-ии) не могу придумать  smile 
PM MAIL Skype GTalk   Вверх
GoldFinch
Дата 11.3.2009, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Lazin, конкретно для хешей - импорт функций по хешам их имен
для уменьшения размера бинарника, сокрытия имен импортируемых функций
помогает от реверсирования

Добавлено через 5 минут и 8 секунд
пока это выглядит как-то так
Код
#include <iostream>
using namespace std;

enum { hash_mult = 5 };

template <int S,int X>
struct hash_int {
    enum { M = ::hash_mult };
    enum { ret = ((((S*M+(X>>24)&0xFF)*M+(X>>16)&0xFF)*M+(X>>8)&0xFF)*M+(X)&0xFF)&0xFFFFFFFF };
};

template <int s1,int s2=0,int s3=0,int s4=0,int s5=0,int s6=0,int s7=0,int s8=0>
struct hash {
    typedef hash<s2,s3,s4,s5,s6,s7,0> hash_next;
    enum { ret=hash_int<hash_next::ret,s1>::ret };
};

template <>
struct hash<0> {
    enum { ret=0 };
};

int main() 
{
    int h= hash<'Load','Libr','aryA'>::ret; //hash of 'LoadLibraryA'
    cout << h << endl;
    return 0;
};

PM MAIL ICQ   Вверх
Cтpaнник
Дата 11.3.2009, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 12.10.2008
Где: Россия, Санкт-Пет ербург

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



1. При такой (самостоятельной) реализации хеш-функции, какова вероятность коллизии?
2. Почему бы не использовать проверенные хеш-функции типа MD5, CRC32, etc.?
PM MAIL   Вверх
GoldFinch
Дата 11.3.2009, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Cтpaнник, у меня есть нехорошее ощущение что компилятор С++ несколько тормознут чтобы за разумное время выполнять метапрограммы содержащие сложные алгоритмы типа md5 а то и crc32

а наличие коллизий лучше проверять заранее, отдельной утилитой
PM MAIL ICQ   Вверх
GoldFinch
Дата 11.3.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



версия с отдельными символами, и правильным порядком подсчета хеша - от 1го символа к последнему
Код

#include <iostream>
using namespace std;

enum { hash_mult = 5 };

template <char s1,
    char s2=0,
    char s3=0,
    char s4=0,
    char s5=0,
    char s6=0,
    char s7=0,
    char s8=0,
    char s9=0,
    char s10=0,
    char s11=0,
    char s12=0,
    char s13=0,
    char s14=0,
    char s15=0,
    char s16=0>
struct hash {
    typedef hash<0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15> hash_next;
    enum { ret =  s16 ? s16 + ::hash_mult * hash_next::ret : hash_next::ret };
};

template <>
struct hash<0> {
    enum { ret=0 };
};

int main() 
{ return hash<'1','2','3'>::ret; }


Добавлено через 5 минут и 47 секунд
версия без тринарного оператора ?:
Код

#include <iostream>
using namespace std;

enum { hash_mult = 5 };

template <char s1,
    char s2=0,
    char s3=0,
    char s4=0,
    char s5=0,
    char s6=0,
    char s7=0,
    char s8=0,
    char s9=0,
    char s10=0,
    char s11=0,
    char s12=0,
    char s13=0,
    char s14=0,
    char s15=0,
    char s16=0>
struct hash {
    typedef hash<0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15> hash_next;
    enum { ret =  s16 + ::hash_mult * hash_next::ret };
};

template <char s1,
    char s2,
    char s3,
    char s4,
    char s5,
    char s6,
    char s7,
    char s8,
    char s9,
    char s10,
    char s11,
    char s12,
    char s13,
    char s14,
    char s15>
struct hash<s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,0> {
    typedef hash<0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15> hash_next;
    enum { ret =  hash_next::ret };
};

template <>
struct hash<0> {
    enum { ret=0 };
};

int main() 
{ return hash<'1','2','3','4','5','6','7'>::ret; }



как лучше, с тринарным оператором условия, или без него?
PM MAIL ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0629 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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