Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2011, 19:45   #1
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию fun with C++ templates

интересно ли кому покодить нестандартно? предлагаю в этой теме пописать метапрограммы (корявые, но все же) на С++. цель - поглубже изучить сабж. в реальных проектах этот код вряд ли будешь использовать (что собсна и отражено в теме).

я пожалуй начну:

1. перевод числа в его двоичное представление
Код:
#include <iostream>

using namespace std;

template <int i>
struct isEven {
	enum { value = 1 };
};

template <>
struct isEven<0> {
	enum { value = 0 };
};

template <int i>
struct Num {
	enum { value = isEven<i % 2>::value + Num<i / 2>::value * 10 };
};

template <>
struct Num<0> {
	enum { value = 0 };
};

int main()
{
	cout << Num<7>::value << endl;
	return 0;
}
в действительности создается новая числовая константа, имеющая двоичный вид исходного числа, что накладывает определенные ограничения (разрядность). но по другому вроде не сделать

2. Определение "глубины" указателя
Код:
#include <iostream>

using namespace std;

template <typename T>
struct PointerDeep {
	enum { value = 0 };
};

template <typename T>
struct PointerDeep<T *> {
	enum { value = 1 + PointerDeep<T>::value };
};

template <typename T>
int getPointerDeep(T t)
{ return PointerDeep<T>::value; }

int main()
{
	int ****p;
	cout << getPointerDeep(p) << endl;
	return 0;
}
все просто. выводит "глубину" (кол-во звездочек) указателя. если это не указатель, выведет 0. вместе с шаблонной функцией-оберткой над шаблонным классом использовать очень удобно, т.к шаблонная функция может сама определить тип


ну с меня пока хватит. кто нить может написать расчет факториала, к примеру (это самый распространенный пример метапрограммы на с++, практически в каждой книге есть)
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 12.01.2011, 00:36   #2
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
интересно ли кому покодить нестандартно?
А то!

Цитата:
Сообщение от pproger Посмотреть сообщение
в действительности создается новая числовая константа, имеющая двоичный вид исходного числа, что накладывает определенные ограничения (разрядность). но по другому вроде не сделать
Ну я сейчас не очень трезвый, поэтому ... и c++0x там...
Код:
#include <iostream>
#include <algorithm>
#include <iterator>

using namespace std;

//------------------------------------------------------------------------

template <char... args>
struct ArrayHolder {
    static const char data[sizeof...(args)];
};

template <char... args> 
const char ArrayHolder<args...>::data[sizeof...(args)] = { args... };

//------------------------------------------------------------------------

template <
    size_t N,
    template <size_t, long long> class F,
    long long arg,
    char... args
>
struct GenerateArrayImpl {
    typedef typename GenerateArrayImpl<N-1, F, arg, F<N, arg>::value, args...>::result result;
};

template <
    template <size_t, long long> class F,
    long long arg,
    char... args
> 
struct GenerateArrayImpl<0, F, arg, args...> {
    typedef ArrayHolder<F<0, arg>::value, args...> result;
};

template <
    size_t N,
    template <size_t, long long> class F,
    long long arg
> 
struct GenerateArray {
    typedef typename GenerateArrayImpl<N-1, F, arg>::result result;
};

//------------------------------------------------------------------------

template <size_t index, long long arg>
struct MetaFunc { 
    enum { value = (arg >> index) & 1 };
};

//------------------------------------------------------------------------

template <size_t N, long long arg>
void test() {
    typedef typename GenerateArray<N, MetaFunc, arg>::result A;
    reverse_copy(A::data, A::data+N, ostream_iterator<unsigned>(cout));
    cout << endl;
}  

int main()
{
    test<sizeof(long long)*8, -1>();
    test<sizeof(unsigned int)*8, 12>(); 
    
    return 0;
}
Запустить можно тут.

Цитата:
Сообщение от pproger Посмотреть сообщение
ну с меня пока хватит. кто нить может написать расчет факториала, к примеру (это самый распространенный пример метапрограммы на с++, практически в каждой книге есть)
И gcd) В общем, можно подряд брать что-нибудь связанное с теорией чисел и реализовывать. Управляющие конструкции еще можно прикрутить, типа if, for, switch и тд...

PS уверен, что это тема в Свободном общении должна быть?) Она ж выносит мозг и плохо влияет на неокрепшую психику...)
still_alive вне форума Ответить с цитированием
Старый 12.01.2011, 00:58   #3
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2still_alive
Цитата:
И gcd) В общем, можно подряд брать что-нибудь связанное с теорией чисел и реализовывать. Управляющие конструкции еще можно прикрутить, типа if, for, switch и тд...
да, больше метакода, хорошего и не очень

в принципе, если народ заинтересуется, можно накидать мета if/for/switch, чтобы их тут юзать

Цитата:
PS уверен, что это тема в Свободном общении должна быть?) Она ж выносит мозг и плохо влияет на неокрепшую психику...)
да в раздел по с++ она как то не вяжется)

твоя реализация жжот напалмом) генерация массива зачот) я не очень хорошо знаю c++0x, некоторые моменты не понятны. есть база для изучения
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 12.01.2011, 20:26   #4
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
в принципе, если народ заинтересуется
Думаешь?) К сожалению, тут мало плюсовиков, а более-менее понимающих шаблоны - еще меньше...

У меня сейчас сессия снова начинается, но я как-нить попробую урвать время для реализации for'a и, скажем, какой-нибудь спископодобной структуры, чтобы попробовать потом их соединить.
still_alive вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MSVS templates coinkrsk Общие вопросы C/C++ 2 30.09.2010 09:51
Just For Fun crazy horse Свободное общение 5 17.07.2009 14:08