Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > инстанцировать шаблон случайным параметром


Автор: GoldFinch 17.3.2009, 17:15
есть шаблон
template<int x> inline void foo();

есть код №1 вида
Код
...
foo<???>();
...
foo<???>();
...
... //еще вызовы foo

где ???  - некоторый параметр которым инстанцируется foo

каждая строчка foo<???>(); приводит к генерации в этом месте некоторого кода

возможен другой вариант кода, №2
Код
...
.... inline .... bar(...)
{
    ...
    foo<???>();
    ...
};
...
... bar(...) ...;
...
... bar(...) ...;
...
... //еще вызовы bar

где на месте при каждого "вызова" bar неявно генерируется код foo


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


этот "случайный" код желательно должен меняться не только от места вызова к месту вызова, но и от компиляции к компиляции. для этого перед компиляцией, сторонней утилитой можно генерить 1 случайную константу RAND_SEED

пример решения для кода №1 средствами препроцессора
Код

//generated.h - этот файл генерится внешней утилитой
#define RAND_SEED 00000

//main.cpp
#include "generated.h"
#define RND(X) ... //некоторый макрос генерирующий случайное число из X и RAND_SEED, например X*RAND_SEED
#define foo foo<RND(__LINE__)>  //случайное число, получается из номера строки

...
foo();
...
foo();
...
... //еще вызовы foo



Автор: mes 17.3.2009, 17:29
нельзя ли вопрос немножко поконкретней сформулировать ? мысль вроде понял, но расплывчато.

Автор: vinter 17.3.2009, 18:04
GoldFinch, ты все врага запутать хочешь? smile

Добавлено через 1 минуту и 4 секунды
Цитата(GoldFinch @  17.3.2009,  18:15 Найти цитируемый пост)
где ???  - некоторый параметр которым инстанцируется foo

а выбор у тебя не велик, __(LINE, DATE, TIME)__

Автор: GoldFinch 17.3.2009, 18:59
vinter, DATE, TIME наверное неподходят, т.к. они возвращают строковый литерал, а его во ремя компиляции не обработать

mes, мысль такая. есть шаблон который принимает int генерит из этого int'а кусок инлайн кода, например такой
template<int n> inline void nops() {__asm{nop};nops<n-1>();};
template<> inline void nops<0>() {};

надо в каждом месте где используется этот шаблон передать ему случайное число
и при этом учесть ситуацию
inline void bar() {nops<???>();};
так чтобы при каждом встраивании bar() использовались разные nops<>
для этого bar наверное тоже надо делать шаблоном %)

Автор: vinter 17.3.2009, 19:59
Цитата(GoldFinch @  17.3.2009,  19:59 Найти цитируемый пост)
т.к. они возвращают строковый литерал

а если использовать твои наработки с хешем?

Автор: mes 17.3.2009, 20:28
Цитата(GoldFinch @  17.3.2009,  17:59 Найти цитируемый пост)
template<int n> inline void nops() {__asm{nop};nops<n-1>();};
template<> inline void nops<0>() {};

Вы пробовали такое компилить  ? шаблоны функций не поддерживают частичную специализацию ..
Хотя можно реализовать через шаблонный класс.



Цитата(GoldFinch @  17.3.2009,  17:59 Найти цитируемый пост)

надо в каждом месте где используется этот шаблон передать ему случайное число

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

Добавлено @ 20:30
P.S. GoldFinch, и где это Вы себе вечно находите приключения ?!  smile 

Автор: GoldFinch 17.3.2009, 20:58
vinter, проблема в том, что язык шаблонов - функциональный, там нет переменных и нельзя поменять их значение, поэтому там нельзя получить бесконечную последовательность чисел, рекурсивно меняя глобальную переменную
но может какой-то способ есть %)

mes, в msvc2008 компилится на ура, стандарт говорит что такое возможно (14.7 абзац 3)

Автор: mes 17.3.2009, 21:17
Цитата(GoldFinch @  17.3.2009,  19:58 Найти цитируемый пост)
msvc2008 компилится на ура,

ага.. и gcc компилит .. не знал ..


Автор: Cтpaнник 17.3.2009, 21:54
GoldFinch, не проще ли будет нарыть в Инете исходники метаморфов и посмотреть реализацию генератора?

Автор: GoldFinch 17.3.2009, 22:00
Cтpaнник, не средствами С++  - сколько угодно реализаций, а вот средствами С++ я не видел
поэтому мне интересно возможно ли такое или нет

Автор: vinter 17.3.2009, 22:03
Цитата(mes @  17.3.2009,  22:17 Найти цитируемый пост)
ага.. и gcc компилит .. не знал ..

там нет никакой частичной специализации. Частичная специализацию у ф-ий запрещена.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)