Является ли шаблонный механизм C ++ просто функцией построения типов?

Я только начал думать на эту тему. Каждый шаблон 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
}

1

Решение

Да. То, что вы описываете, является макросистемой. Препроцессор C предоставляет слабую форму макросов, но, в общем случае, макросы — это не что иное, как программы для написания исходного кода (с исходным кодом в качестве входных данных), выполняемые во время компиляции.

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

Благодаря мощной системе макросов многие операторы, ранее встроенные в язык, могут быть определены пользователем или включены в стандартную библиотеку.

Если вы заинтересованы в этой теме, взгляните на Scheme, и особенно на язык программирования Racket. У Racket очень маленькое ядро, и почти весь язык, на котором работает пользователь, основан на макросах.

3

Другие решения

Нет. Одна из главных особенностей шаблонов заключается в том, что они обеспечивают статически выведенный типизированный безопасный полиморфизм.

По определению, вы не можете сделать это во время выполнения. Если вы хотите переместить все во время выполнения, не используйте C ++, используйте что-то оптимизированное для позднего связывания.

Обновление: если вы говорите о функции, которая запускается во время компиляции, то (а) вам понадобится ваш компилятор для интерпретации C ++ (если вы хотите написать его на C ++), и вы потеряете преимущества декларативного, функционального язык это шаблоны. Я не вижу выгоды.

2

Есть два способа, которыми программисты 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
1

Одним из преимуществ BOOST.PP перед шаблонами является то, что программы, созданные с
BOOST.PP компилируется быстрее, чем эквивалентные программы с использованием шаблонов, в
хотя бы по этому посту повысить список развития.

Даже с улучшенной скоростью GCC с использованием хешей вместо линейных
поиск, я думаю, что использование BOOST.PP все еще быстрее, я думаю, из-за
ограничения, упомянутые Уолтером Брайтом в упомянутом посте.

1
По вопросам рекламы [email protected]