Запрещают ли выражения boost :: lambda :: bind предотвращать вставку / существует ли альтернативная форма, которая этого не делает? - PullRequest
0 голосов
/ 18 июля 2011

С точки зрения академического интереса, предотвращает ли использование шаблонов связывания (особенно в boost :: lambda) встраивание? И если да, то, кроме использования объявленных функторов, существует ли форма boost :: lambda, которая не предотвращает встраивание? (И особенно в последних gcc)

namespace bll = boost::lambda;

class MyItem
{
    public:
        float attribute() { return 4; }
}

struct AttributeLessConst
{
    AttributeLess( float value_a ) : value( value_a ) {}
    bool operator()( const MyItem & a ) 
    { 
        return a.attribute() < value;
    };

    const float value;
}

std::list<MyItem> myList;

remove_if_seq( myList, AttributeLessConst( 1.5 ) );        // in-linable // yes
remove_if_seq( myList, bll::bind(&MyItem::attribute, *bll::_1) < 1.5 );  // yes?

1 Ответ

2 голосов
/ 18 июля 2011

Нет.Ничто не мешает встраиванию за исключением того, насколько продвинута технология компилятора *.Если Boost.Lambda не прибегнет к стиранию типов, которое не имеет смысла использовать, все, что он делает, может быть проверено статически так же просто, как рукописный код.Соответствующий фрагмент в документации Boost.Lambda предполагает, что библиотека выполняет это обещание.

*: и / или технология выполнения при рассмотрении не только программ, но и, например, общих библиотек и динамически загружаемыхмодули.

...