Synopsis
Description
При построении трансформаций более высокого порядка с помощью<
proto::make<>
>или<
proto::lazy<>
>, вы иногда хотели бы создавать типы, которые параметризуются с помощью трансформаций Прото. В таких трансформациях в стиле лямбда Proto без посторонней помощи найдет все вложенные трансформации и применит их, даже если вы не хотите, чтобы они применялись. Рассмотрим следующее преобразование, которое заменит<proto::_>в<Bar<proto::_>()>на<proto::terminal<int>::type>:
template<typename T>
struct Bar
{};
struct Foo :
proto::when<proto::_, Bar<proto::_>() >
{};
proto::terminal<int>::type i = {0};
int main() {
Foo()(i);
std::cout << typeid(Foo()(i)).name() << std::endl;
}
Если вы действительно хотите построить объект по умолчанию<Bar<proto::_>>, вы должны защитить<_>, чтобы предотвратить его применение. Вы можете использовать<proto::protect<>>следующим образом:
struct Foo :
proto::when<proto::_, Bar<proto::protect<proto::_> >() >
{};