Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Templ<T...>
но и Templ1<Templ2<T>...>
или g(f<v>...)
а может также потому, что это фича с нового стандарта и еще мало кем используется. А все остальное — это обыкновенное ООП: несколько классов с обычными методами и конструкторами — даже наследования нету.struct GreaterThan // определяем
{
const int _value;
GreaterThan( int value ): _value(value) { };
inline bool operator()( int arg ) { return arg > value; };
};
auto callback = GreaterThan(3); // конфигурируем
inline bool gt( int x, int y ) { return x > y; }; // определяем
auto callback = partApply<1>(gt)(3); // конфигурируем
auto f1 = carry(f);
auto f2 = f1(5, 5);
auto v15 = f2(5);
f1(5, 5)(5) == f1(5)(5, 5) == f1(5, 5, 5) == f1(5)(5)(5)
carry :: ( (a, b) -> c ) -> (a -> b -> c)
carry f = \ x y -> f (x, y)
boost::bind( f, _2, _1 );выглядит понятнее чем
permute< 1, 0 >( f );
boost::bind( f, _2, "Arg1", _1, "Arg2" );
permute< 1, 0 >( PartApply< 2 >( PartApply< 1 >( f, "Arg1" ), "Arg2" ) );
boost::bind( &CMyClass::f, this );
std::shared_ptr< CMyClass > sp = ...;
boost::bind( &CMyClass::f, sp );
boost::bind( &CMyClass::f, _ );
// Тут без контекста совершенно непонятно, где произойдет вызов f.
int f( int, int, int, int );
// много кода
auto x = carry( f )( 1, 2 );
// много кода
auto y = x( 3 );
// много кода
auto z = y( 2 );
int f( int, int, int, int );
auto g = boost::bind( f, 1, 2, 3, 4 ); // здесь мы f еще не вызывали
g(); // а вот тут уже вызвали.
void DrawCircle( double x, double y, double R );
// И к чему мы тут прибиндили 1.??
// Надо смотреть определение DrawCircle, иначе не понятно.
auto f = boost::bind( &DrawCircle, 1., _, _ );
// Тут все очевидно
auto f =
[]( double y, double R )
{
return DrawCircle( 1., y, R );
};
auto f1 = partApply<3, 0>(f)(x, y); // передаю третий аргумент, а потом нулевой
auto std::function< bool( int, int ) > f = []( int x, int y ){ return x > y; };
int y = 3;
auto f1 = partApply< 1 >( f )( ref( y ) ); // y сохранить по ссылке
assert( f1( 4 )() == true );
y = 4;
assert( f1( 4 )() == false );
#include <iostream>
#include <boost/bind.hpp>
using namespace boost;
int f(){ std::cout << "f" << std::endl; return 3; };
int b( int x, int y ){ return x > y; };
int _tmain( int, TCHAR*[] )
{
// Подставить в качестве второго аргумента отложенный вызов f
auto F = bind( b, _1, bind( f ) );
std::cout << F( 2 ) << std::endl;
std::cout << F( 4 ) << std::endl;
return 0;
}
f
0
f
1
auto g = f( 5 );
, я думаю что это вызов функции/функтора f, но в вашем случае — это подстановка аргумента, а вызов выглядел бы (при условии, что f каррированный вариант функции одного аргумента) так: auto g = f( 5 )();
. Лично у меня это вызывает „разрыв шаблона“ в голове.»auto f1 = partApply<3, 0>(f)(x, y); // передаю третий аргумент, а потом нулевой
boost::bind( f, _2, y, _1, x );
auto f1 = permute< 1, 0 >( partApply<3, 0>(f)(x, y) );
C++ Variadic templates. Каррирование и частичное применение