2015-05-30 1 views
1

Не могли бы вы показать ситуации, когда использование boost :: phoenix :: val является незаменимым (или, по крайней мере, очень удобным), а не просто необязательным. Подталкивания документ не выходит далеко за примерами, какМотивация использования boost :: phoenix :: val?

std::cout<<boost::phoenix::val(3)(); //output is 3. 

Когда и почему один предпочел бы

boost::phoenix::val(t)(); 

вместо просто

t; 

ответ

2

Вы бы не стал.

Вы предпочли бы его, если вам требуется (отложенный) вызываемый:

template <typename F> 
void print_three_times(F f) { 
    std::cout << 3*f() << "\n"; 
} 

Теперь вы можете вызвать его с помощью

print_three_times(phx::val(3)); 

int i; 
std::cin >> i; 
print_three_times(phx::val(i)); 

Также вы можете использовать его, чтобы заставить любую ссылку на феникс ленивый актер:

std::cout << 3; // not an actor 
std::cout << val(3); // a lazy actor 
+0

Ну, еще 2 вопроса, которые я должен был сразу задать: 1) - boost :: phoenix :: val используется в основном в тандеме с std :: co ешь? 2) может ли он использоваться с не-POD-типами? – alxprogger

+0

1) нет 2) Да, он скопирует значение. – sehe