Здравствуйте, 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, чего в макросах например нету. Там препроцессор просто тупо забивает все переданными занчениями. В шаблонах ваще работает не препроцессор, а компилятор, который строит у себя специальные деревья разбора для шаблонов и инстанцирует только те части кода, которые используются. Ваще есть такая книженция Джосатиса/Ваневурда "Шаблоны С++", после прочтения которой ваще меняется взгляд на плюсы и программирование на них.