2013-11-20 1 views
2

Я довольно новичок в Boost fusion, и, возможно, мой вопрос не имеет никакого смысла. Fusion представлен как «слияние между временем выполнения и алгоритмами времени компиляции». Я думаю, что теряюсь между тем, что делается во время компиляции, и тем, что делается во время работы в режиме слияния.время компиляции и время запуска с boost :: fusion

Позволяет взять шаблон for_each, ведь они два! function и metafunction. Metafunction выглядит как шаблон класса признаков для функции for_each, не так ли?.

взяв пример for_each функции:

struct increment 
{ 
    template<typename T> 
    void operator()(T& t) const 
    { 
     ++t; 
    } 
}; 

vector<int,int> vec(1,2); 
for_each(vec, increment()); 

Я понимаю, что петля for_each будет разворачивались во время компиляции для получения кода как

++at_c<0>(vec); 
++at_c<1>(vec); 

(очевидно, at_c<x> шаблоны также будет генерировать код для доступа к членам вектора слияния)

Для меня как функции for_each, так и metafun ction «компилировать временные программы», неправильно снова?

Может кто-нибудь объяснить мне (на простом примере), какая часть ускорения слияния - это просто метапрограмма времени компиляции и что такое классический код времени компиляции?

ответ

2

boost :: fusion - это манипуляция разнородными коллекциями типов. В C++ обработка типов обрабатывается во время компиляции (metafunctions), в то время как манипуляция значениями преимущественно обрабатывается во время выполнения (функции).

Если вы внимательно посмотрите на документацию в boost :: fusion, вы увидите, что метафайлы возвращают такие вещи, как ... :: type. Эти типы должны обрабатываться во время компиляции.

В C++ есть что-то вроде RTTI (информация о типе времени выполнения), но по большей части его способность отбрасывается для определения типа чего-то во время выполнения. Во время выполнения нет манипуляций типа.

Таким образом, манипуляции типа должны решаться во время компиляции. Конструктивные элементы программирования не полезны во время компиляции. Конструкции времени компиляции C++ более схожи с конструкциями функционального программирования. Я проделал длинный путь, чтобы сказать, что boost :: fusion :: for_each - это алгоритм для разворачивания циклов во время компиляции, так что все типы в последовательности видны «линейным образом» во время компиляции.

Значения для каждого типа тогда являются разыменованием во время выполнения типа.

Таким образом, при достижении полного круга функция boost :: fusion :: for_each предоставляет значение, а metafunction boost :: fusion :: for_each возвращает тип, который может быть полезен для косвенности через функтор для получения связанного значения ,

+0

Хорошо, спасибо Раймонду, я думаю, что мой вопрос в основном отражает мое невежество слияния. Я сокращу его, чтобы сделать его полезным для других новичков fusion. – Laurent

 Смежные вопросы

  • Нет связанных вопросов^_^