Я только начал думать на эту тему. Каждый шаблон C ++ может быть заменен «нормальной» функцией, которая возвращает объект класса (или функции)? Нормальный означает программу времени компиляции.
Поэтому я хочу заменить создание экземпляра шаблона в C ++ компиляцией на «обычные функции (означает программы времени компиляции, работающие с деревом синтаксического анализа компилятора или чем-то подобным)», и я не хочу использовать описательный синтаксис.
Как вы думаете, следующей идеей мы можем заменить весь шаблонный механизм в C ++? Вы думаете, что таким образом результат будет легче понять шаблонизацией? Вопрос немного теоретический, я знаю, но я не знаю, где лучше всего обсудить этот вопрос.
template<typename T>
struct A
{
int foo();
bool bar;
T data;
};
#if 0
class A(typename T) // class bulder after "("{
class ret; // class object can only declared in class builder
ret.name = "whatever_compile_time_string";
ret += body // body is a class builder member with class declaration syntax
{
body(); // constructor
~body(); // destructor
int foo(); // method
bool bar; // member
};
ret += member(T, "data"); // "inject" a templated member
return ret;
}
#endifint main()
{
A<int> a;
#if 0
// create a new class
typedef new class A(int) AInt;
// or
typedef new class A(int); // in this case class.name must be an initialized thing
#endif
}
Да. То, что вы описываете, является макросистемой. Препроцессор C предоставляет слабую форму макросов, но, в общем случае, макросы — это не что иное, как программы для написания исходного кода (с исходным кодом в качестве входных данных), выполняемые во время компиляции.
Теперь теория макросов оказывается несколько сложной. Очевидно, что вы можете делать все, что захотите, с любой макросистемой, которая позволяет выполнять код во время компиляции, но большая работа была проделана для того, чтобы сделать правильные вещи легко. (В частности, это действительно помогает иметь синтаксическую конструкцию цитаты, в которую вы можете интерполировать.)
Благодаря мощной системе макросов многие операторы, ранее встроенные в язык, могут быть определены пользователем или включены в стандартную библиотеку.
Если вы заинтересованы в этой теме, взгляните на Scheme, и особенно на язык программирования Racket. У Racket очень маленькое ядро, и почти весь язык, на котором работает пользователь, основан на макросах.
Нет. Одна из главных особенностей шаблонов заключается в том, что они обеспечивают статически выведенный типизированный безопасный полиморфизм.
По определению, вы не можете сделать это во время выполнения. Если вы хотите переместить все во время выполнения, не используйте C ++, используйте что-то оптимизированное для позднего связывания.
Обновление: если вы говорите о функции, которая запускается во время компиляции, то (а) вам понадобится ваш компилятор для интерпретации C ++ (если вы хотите написать его на C ++), и вы потеряете преимущества декларативного, функционального язык это шаблоны. Я не вижу выгоды.
Есть два способа, которыми программисты C могут добиться таких же эффектов, как шаблоны в C ++. Однако я не вижу никакой пользы от использования этих способов вместо шаблонов в C ++. Но если вы думаете, что шаблоны трудно понять, посмотрите на них:
// N: typename, T: used type
#define MAKE_A(N, T) class N { \
public: N(){} ~N(){} bool flag; T data; }
MAKE_A(AInt, int);
MAKE_A(AFloat, float);
файл: A.h (не ставить охрану включения):
// A_NAME: typename, A_TYPE: used type
class A_NAME {
public:
A_NAME(){}
~A_NAME(){}
bool flag;
A_TYPE data;
};
Использование:
#define A_NAME AInt
#define A_TYPE int
#include "A.h"#undef A_NAME
#undef A_TYPE
#define A_NAME AFloat
#define A_TYPE float
#include "A.h"#undef A_NAME
#undef A_TYPE
Одним из преимуществ BOOST.PP перед шаблонами является то, что программы, созданные с
BOOST.PP компилируется быстрее, чем эквивалентные программы с использованием шаблонов, в
хотя бы по этому посту повысить список развития.
Даже с улучшенной скоростью GCC с использованием хешей вместо линейных
поиск, я думаю, что использование BOOST.PP все еще быстрее, я думаю, из-за
ограничения, упомянутые Уолтером Брайтом в упомянутом посте.