Здравствуйте, 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 };
};
Или с помощью макросов написать аналогичный код, и не получить при этом ошибку компиляции?
Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>всем добрый вечер!
ATP>Вот возник такой вопрос: ATP>Можно ли Шаблоны С++ заменить похожими по действию макросами, или они делают нечто большее чем просто подстановку?
Некоторые шаблоны можно заменить похожими по действию макросами,
но в общем случае — нет.
Например от макроса нельзя отнаследоваться
Можешь к примеру посмотреть на тот же std::vector
и прикинуть как его можно было бы реализовать без шаблонов
и как бы тебе могли бы помочь макросы в этом случае.
Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>всем добрый вечер!
ATP>Вот возник такой вопрос: ATP>Можно ли Шаблоны С++ заменить похожими по действию макросами, или они делают нечто большее чем просто подстановку?
1. Проверка синтаксиса.
2. наследование
3. Метапрограммирование
Это на вскидку. Первые два — важнее. чем третье.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>Можно ли Шаблоны С++ заменить похожими по действию макросами, или они делают нечто большее чем просто подстановку?
Нельзя. Они делают гораздо большее:
0) встроенность в поиск имён
1) сопоставление аргументов => специализация, частичная специализация, перегрузка
2) порождение новых типов
3) выборочное воплощение членов шаблона класса (instantiation)
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>>всем добрый вечер!
ATP>>Вот возник такой вопрос: ATP>>Можно ли Шаблоны С++ заменить похожими по действию макросами, или они делают нечто большее чем просто подстановку?
А>Некоторые шаблоны можно заменить похожими по действию макросами, А>но в общем случае — нет.
А>Например от макроса нельзя отнаследоваться
А>Можешь к примеру посмотреть на тот же std::vector А>и прикинуть как его можно было бы реализовать без шаблонов А>и как бы тебе могли бы помочь макросы в этом случае.
Наверное я несовсем понятно выразился:
Один человек утверждает, что шаблоны — это всего навсего подстановка, т.к компилятор просто впечатывет в нужные места нужный тип, и все.
Хотелось бы понять так ли это, или компилятор делает еще нечто, то что он не делает в случае с макросами?
Т.е например:
template <class T>
class CMyClass
{
T m_value;
......
T MyFunction (T param)
{
return m_value + param;
}
};
он утверждает что просто произойдет подстановка какв макросах
типа развернется напимер так:
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>>всем добрый вечер!
ATP>>Вот возник такой вопрос: ATP>>Можно ли Шаблоны С++ заменить похожими по действию макросами, или они делают нечто большее чем просто подстановку? LVV>1. Проверка синтаксиса. LVV>2. наследование LVV>3. Метапрограммирование LVV>Это на вскидку. Первые два — важнее. чем третье.
Можно пример, желательно незамудренный, кода из которого можно увидеть что шаблон ведет себя не как простая подстановка?
Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>Здравствуйте, LaptevVV, Вы писали:
LVV>>Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>>>всем добрый вечер!
ATP>>>Вот возник такой вопрос: ATP>>>Можно ли Шаблоны С++ заменить похожими по действию макросами, или они делают нечто большее чем просто подстановку? LVV>>1. Проверка синтаксиса. LVV>>2. наследование LVV>>3. Метапрограммирование LVV>>Это на вскидку. Первые два — важнее. чем третье.
ATP>Можно пример, желательно незамудренный, кода из которого можно увидеть что шаблон ведет себя не как простая подстановка?
Уже одно только упоминание вами слов "незамудренный код" говорит о том, что шаблоны — это неизмеримо больше макросов. А в простых случаях, действительно, это сильно похоже на подстановку. Но если при использовании макросов подстановка — это отдельный и независимый от проверки синтаксиса шаг, то шаблоны — проверка синтаксической конструкции в момент подстановки. Так что не совсем простая подстановка, нет отдельно подстановки, а потом компиляции.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, 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>Так вот хочется узнать, так ли это, или компилятор делает еще какие-то проверки, которые он не делает в случае с шаблонами?
ATP>Наверное я несовсем понятно выразился: ATP>Один человек утверждает, что шаблоны — это всего навсего подстановка, т.к компилятор просто впечатывет в нужные места нужный тип, и все. ATP>Хотелось бы понять так ли это, или компилятор делает еще нечто, то что он не делает в случае с макросами?
Да, при инстанцировании шаблона функции или шаблона класса компилятор делает больше — он генерирует новую функцию и новый класс соответственно. При макроподстановке же как текст был, так текст и остался.
Помимо этого, само определение шаблона проверятся на наличие синтаксических ошибок, чего не проискходит на фазе препроцессирования.
Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>Один человек утверждает, что шаблоны — это всего навсего подстановка, т.к компилятор просто впечатывет в нужные места нужный тип, и все.
Если принять, что шаблоны — это "сильно навороченные" макросы, так как они-де (внутренне) создают конкретные типы или функции на основе более общего описания, которые потом обрабатываются "на общих основаниях", то будет логично считать, что Си++ — это "сильно навороченный" макроассемблер, так как из кода на Си++ порождается обычный объектный (машинный) код, который обрабатывается процессором "на общих основаниях".
Я кончил, джентльмены, мне остается только поблагодарить вас за внимание.
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, чего в макросах например нету. Там препроцессор просто тупо забивает все переданными занчениями. В шаблонах ваще работает не препроцессор, а компилятор, который строит у себя специальные деревья разбора для шаблонов и инстанцирует только те части кода, которые используются. Ваще есть такая книженция Джосатиса/Ваневурда "Шаблоны С++", после прочтения которой ваще меняется взгляд на плюсы и программирование на них.
Здравствуйте, Glоbus, Вы писали:
G>Здравствуйте, AcidTheProgrammer, Вы писали:
...
G>Я думаю на макросах такое не прокатит — тут пользуется принцип SFINAE, чего в макросах например нету. Там препроцессор просто тупо забивает все переданными занчениями. В шаблонах ваще работает не препроцессор, а компилятор, который строит у себя специальные деревья разбора для шаблонов и инстанцирует только те части кода, которые используются. Ваще есть такая книженция Джосатиса/Ваневурда "Шаблоны С++", после прочтения которой ваще меняется взгляд на плюсы и программирование на них.
Здравствуйте, _BOBAH_, Вы писали:
_BO>Здравствуйте, Glоbus, Вы писали:
G>>Здравствуйте, AcidTheProgrammer, Вы писали:
_BO>...
G>>Я думаю на макросах такое не прокатит — тут пользуется принцип SFINAE, чего в макросах например нету. Там препроцессор просто тупо забивает все переданными занчениями. В шаблонах ваще работает не препроцессор, а компилятор, который строит у себя специальные деревья разбора для шаблонов и инстанцирует только те части кода, которые используются. Ваще есть такая книженция Джосатиса/Ваневурда "Шаблоны С++", после прочтения которой ваще меняется взгляд на плюсы и программирование на них.
_BO>не подскажешь ссылочку?
Посмотри у Anatolix — прям в гугле набрать...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Glоbus, Вы писали:
G>Я думаю на макросах такое не прокатит — тут пользуется принцип SFINAE, чего в макросах например нету.
В данном случае никакого SFINAE нет. Тут банальная перегрузка функций. Хотя макросы тоже нервно курят в углу.
А SFINAE используется при проверке налиия метода с данной сигнатурой в классе