Шаблоны в C++
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 24.11.04 14:12
Оценка:
всем добрый вечер!

Вот возник такой вопрос:
Можно ли Шаблоны С++ заменить похожими по действию макросами, или они делают нечто большее чем просто подстановку?
Re: Шаблоны в C++
От: Bell Россия  
Дата: 24.11.04 14:24
Оценка: 5 (1)
Здравствуйте, AcidTheProgrammer, Вы писали:

ATP>всем добрый вечер!


ATP>Вот возник такой вопрос:

ATP>Можно ли Шаблоны С++ заменить похожими по действию макросами, или они делают нечто большее чем просто подстановку?

Сможешь с помощью макросов переписать этот код?

// primary template to compute 3 to the Nth 
template<int N> 
class Pow3 { 
  public: 
    enum { result=3*Pow3<N-1>::result }; 
}; 

// full specialization to end the recursion 
template<> 
class Pow3<0> { 
  public: 
    enum { result = 1 }; 
};


Или с помощью макросов написать аналогичный код, и не получить при этом ошибку компиляции?

template <typename T>
struct test
{
   void f() { T::n = 0; }
};
int main()
{
   test<int> t;
   return 0;
}
Любите книгу — источник знаний (с) М.Горький
Re: Шаблоны в C++
От: Аноним  
Дата: 24.11.04 14:25
Оценка:
Здравствуйте, AcidTheProgrammer, Вы писали:

ATP>всем добрый вечер!


ATP>Вот возник такой вопрос:

ATP>Можно ли Шаблоны С++ заменить похожими по действию макросами, или они делают нечто большее чем просто подстановку?

Некоторые шаблоны можно заменить похожими по действию макросами,
но в общем случае — нет.

Например от макроса нельзя отнаследоваться

Можешь к примеру посмотреть на тот же std::vector
и прикинуть как его можно было бы реализовать без шаблонов
и как бы тебе могли бы помочь макросы в этом случае.
Re: Шаблоны в C++
От: LaptevVV Россия  
Дата: 24.11.04 14:28
Оценка:
Здравствуйте, AcidTheProgrammer, Вы писали:

ATP>всем добрый вечер!


ATP>Вот возник такой вопрос:

ATP>Можно ли Шаблоны С++ заменить похожими по действию макросами, или они делают нечто большее чем просто подстановку?
1. Проверка синтаксиса.
2. наследование
3. Метапрограммирование
Это на вскидку. Первые два — важнее. чем третье.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Шаблоны в C++
От: Кодт Россия  
Дата: 24.11.04 14:31
Оценка: +1
Здравствуйте, AcidTheProgrammer, Вы писали:

ATP>Можно ли Шаблоны С++ заменить похожими по действию макросами, или они делают нечто большее чем просто подстановку?


Нельзя. Они делают гораздо большее:
0) встроенность в поиск имён
1) сопоставление аргументов => специализация, частичная специализация, перегрузка
2) порождение новых типов
3) выборочное воплощение членов шаблона класса (instantiation)
Перекуём баги на фичи!
Re[2]: Шаблоны в C++
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 24.11.04 14:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, AcidTheProgrammer, Вы писали:


ATP>>всем добрый вечер!


ATP>>Вот возник такой вопрос:

ATP>>Можно ли Шаблоны С++ заменить похожими по действию макросами, или они делают нечто большее чем просто подстановку?

А>Некоторые шаблоны можно заменить похожими по действию макросами,

А>но в общем случае — нет.

А>Например от макроса нельзя отнаследоваться


А>Можешь к примеру посмотреть на тот же std::vector

А>и прикинуть как его можно было бы реализовать без шаблонов
А>и как бы тебе могли бы помочь макросы в этом случае.


Наверное я несовсем понятно выразился:
Один человек утверждает, что шаблоны — это всего навсего подстановка, т.к компилятор просто впечатывет в нужные места нужный тип, и все.
Хотелось бы понять так ли это, или компилятор делает еще нечто, то что он не делает в случае с макросами?

Т.е например:


template <class T>
class CMyClass
{
 T m_value;
 ......
 T MyFunction (T param)
{
  return m_value + param;
}

};


он утверждает что просто произойдет подстановка какв макросах
типа развернется напимер так:

class CMyClass_CSomeClass
{
 CSomeClass m_value;
 ......
 CSomeClass MyFunction (CSomeClass param)
{
  return m_value + param;
}

};


и все, далше компилятор идет по проторенному пути.

Так вот хочется узнать, так ли это, или компилятор делает еще какие-то проверки, которые он не делает в случае с шаблонами?
Re[2]: Шаблоны в C++
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 24.11.04 14:38
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, AcidTheProgrammer, Вы писали:


ATP>>всем добрый вечер!


ATP>>Вот возник такой вопрос:

ATP>>Можно ли Шаблоны С++ заменить похожими по действию макросами, или они делают нечто большее чем просто подстановку?
LVV>1. Проверка синтаксиса.
LVV>2. наследование
LVV>3. Метапрограммирование
LVV>Это на вскидку. Первые два — важнее. чем третье.

Можно пример, желательно незамудренный, кода из которого можно увидеть что шаблон ведет себя не как простая подстановка?
Re[3]: Шаблоны в C++
От: LaptevVV Россия  
Дата: 24.11.04 14:44
Оценка:
Здравствуйте, AcidTheProgrammer, Вы писали:

ATP>Здравствуйте, LaptevVV, Вы писали:


LVV>>Здравствуйте, AcidTheProgrammer, Вы писали:


ATP>>>всем добрый вечер!


ATP>>>Вот возник такой вопрос:

ATP>>>Можно ли Шаблоны С++ заменить похожими по действию макросами, или они делают нечто большее чем просто подстановку?
LVV>>1. Проверка синтаксиса.
LVV>>2. наследование
LVV>>3. Метапрограммирование
LVV>>Это на вскидку. Первые два — важнее. чем третье.

ATP>Можно пример, желательно незамудренный, кода из которого можно увидеть что шаблон ведет себя не как простая подстановка?

Уже одно только упоминание вами слов "незамудренный код" говорит о том, что шаблоны — это неизмеримо больше макросов. А в простых случаях, действительно, это сильно похоже на подстановку. Но если при использовании макросов подстановка — это отдельный и независимый от проверки синтаксиса шаг, то шаблоны — проверка синтаксической конструкции в момент подстановки. Так что не совсем простая подстановка, нет отдельно подстановки, а потом компиляции.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Шаблоны в C++
От: Кодт Россия  
Дата: 24.11.04 14:51
Оценка:
Здравствуйте, AcidTheProgrammer, Вы писали:

ATP>Наверное я несовсем понятно выразился:

ATP>Один человек утверждает, что шаблоны — это всего навсего подстановка, т.к компилятор просто впечатывет в нужные места нужный тип, и все.
ATP>Хотелось бы понять так ли это, или компилятор делает еще нечто, то что он не делает в случае с макросами?

Например, он проверяет соответствие типов.
template<class T>
struct whatisit
{
  static void print()
  {
    cout << typeid(T).name() << " is a common type" << endl;
  }
};
template<class T>
struct whatisit<T*>
{
  static void print()
  {
    cout << typeid(T*).name() << " is a pointer to " << endl;
    whatisit<T>::print();
  }
};
Перекуём баги на фичи!
Re[3]: Шаблоны в C++
От: Аноним  
Дата: 24.11.04 14:53
Оценка:
Здравствуйте, AcidTheProgrammer, Вы писали:

ATP>Наверное я несовсем понятно выразился:

ATP>Один человек утверждает, что шаблоны — это всего навсего подстановка, т.к компилятор просто впечатывет в нужные места нужный тип, и все.

Если так рассуждать, то вообще компилятор ничего другого,
кроме подстановок и трансформаций не делает.
Что делает компилятор? Берет кусок на С++ и подставляет вместо него
последовательность машинных команд. Все просто

ATP>Так вот хочется узнать, так ли это, или компилятор делает еще какие-то проверки, которые он не делает в случае с шаблонами?


Да, кончено же компилятор делает проверки.

самый простой пример.
template<int N> 
class Inc 
{ 
  public: 
    enum { result=N+1 }; 
};


Попробуй написать
int res = Inc<"1">::result;

Получишь ошибку компиляции.
Препроцессор вообще почти никаких проверок не делает...
Re[4]: Шаблоны в C++
От: JakeS  
Дата: 24.11.04 14:54
Оценка:
Конечно делает. простейший пример автоопределение:

template <class T> f(T t)

можно вызвать как
int k;
f(k);

тем неменее в потом можно использовать тип в теле функции.
Re[3]: Шаблоны в C++
От: Анатолий Широков СССР  
Дата: 24.11.04 14:55
Оценка:
ATP>Наверное я несовсем понятно выразился:
ATP>Один человек утверждает, что шаблоны — это всего навсего подстановка, т.к компилятор просто впечатывет в нужные места нужный тип, и все.
ATP>Хотелось бы понять так ли это, или компилятор делает еще нечто, то что он не делает в случае с макросами?

Да, при инстанцировании шаблона функции или шаблона класса компилятор делает больше — он генерирует новую функцию и новый класс соответственно. При макроподстановке же как текст был, так текст и остался.
Помимо этого, само определение шаблона проверятся на наличие синтаксических ошибок, чего не проискходит на фазе препроцессирования.
Re[3]: Шаблоны в C++
От: achp  
Дата: 24.11.04 15:07
Оценка:
Здравствуйте, AcidTheProgrammer, Вы писали:

ATP>Один человек утверждает, что шаблоны — это всего навсего подстановка, т.к компилятор просто впечатывет в нужные места нужный тип, и все.


Если принять, что шаблоны — это "сильно навороченные" макросы, так как они-де (внутренне) создают конкретные типы или функции на основе более общего описания, которые потом обрабатываются "на общих основаниях", то будет логично считать, что Си++ — это "сильно навороченный" макроассемблер, так как из кода на Си++ порождается обычный объектный (машинный) код, который обрабатывается процессором "на общих основаниях".
Я кончил, джентльмены, мне остается только поблагодарить вас за внимание.
Re[3]: Шаблоны в C++
От: Glоbus Украина  
Дата: 24.11.04 15:54
Оценка: 1 (1) +1
Здравствуйте, AcidTheProgrammer, Вы писали:


ATP>Можно пример, желательно незамудренный, кода из которого можно увидеть что шаблон ведет себя не как простая подстановка?


Можно. Например классическая проверка является ли один класс наследником другого

template<class Der, class Base>
class IsDerived
{
private:
    typedef char _Yes_;
    typedef double _No_;
    static _Yes_ Test( Base* );
    static _No_ Test(...);
public:
    enum { Yes = sizeof(_Yes_) == sizeof( Test((Der*)0) ) , No = !Yes };
};


class CA
{
};

class CB : public CA 
{
};

class CC
{
};

 
int main()
{
  std::cout << IsDerived<CB,CA>::Yes << std::endl;
  std::cout << IsDerived<CC,CA>::Yes << std::endl;
}


Я думаю на макросах такое не прокатит — тут пользуется принцип SFINAE, чего в макросах например нету. Там препроцессор просто тупо забивает все переданными занчениями. В шаблонах ваще работает не препроцессор, а компилятор, который строит у себя специальные деревья разбора для шаблонов и инстанцирует только те части кода, которые используются. Ваще есть такая книженция Джосатиса/Ваневурда "Шаблоны С++", после прочтения которой ваще меняется взгляд на плюсы и программирование на них.
Удачи тебе, браток!
Re[4]: Шаблоны в C++
От: _BOBAH_ Россия  
Дата: 06.12.04 07:53
Оценка:
Здравствуйте, Glоbus, Вы писали:

G>Здравствуйте, AcidTheProgrammer, Вы писали:


...

G>Я думаю на макросах такое не прокатит — тут пользуется принцип SFINAE, чего в макросах например нету. Там препроцессор просто тупо забивает все переданными занчениями. В шаблонах ваще работает не препроцессор, а компилятор, который строит у себя специальные деревья разбора для шаблонов и инстанцирует только те части кода, которые используются. Ваще есть такая книженция Джосатиса/Ваневурда "Шаблоны С++", после прочтения которой ваще меняется взгляд на плюсы и программирование на них.


не подскажешь ссылочку?
... << RSDN@Home 1.1.3 stable >>
Re[5]: Шаблоны в C++
От: LaptevVV Россия  
Дата: 06.12.04 08:00
Оценка:
Здравствуйте, _BOBAH_, Вы писали:

_BO>Здравствуйте, Glоbus, Вы писали:


G>>Здравствуйте, AcidTheProgrammer, Вы писали:


_BO>...


G>>Я думаю на макросах такое не прокатит — тут пользуется принцип SFINAE, чего в макросах например нету. Там препроцессор просто тупо забивает все переданными занчениями. В шаблонах ваще работает не препроцессор, а компилятор, который строит у себя специальные деревья разбора для шаблонов и инстанцирует только те части кода, которые используются. Ваще есть такая книженция Джосатиса/Ваневурда "Шаблоны С++", после прочтения которой ваще меняется взгляд на плюсы и программирование на них.


_BO>не подскажешь ссылочку?

Посмотри у Anatolix — прям в гугле набрать...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Шаблоны в C++
От: WolfHound  
Дата: 06.12.04 10:30
Оценка: +1
Здравствуйте, Glоbus, Вы писали:

G>Я думаю на макросах такое не прокатит — тут пользуется принцип SFINAE, чего в макросах например нету.

В данном случае никакого SFINAE нет. Тут банальная перегрузка функций. Хотя макросы тоже нервно курят в углу.
А SFINAE используется при проверке налиия метода с данной сигнатурой в классе
Автор: WolfHound
Дата: 14.11.03
...
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.