получить адресс предиката
От: Аноним  
Дата: 26.09.07 09:54
Оценка:
Добрый день.
есть вопрос.
вот есть прегикат каторый сортирует список.

template<class T>
struct sorter: std::binary_function<std::string , std::string ,bool >
{
    T func_;
    sorter(T  func):func_(func){}
    bool  operator ()(std::string & str1,std::string &str2)
    {
           return this->func_(// ну соответственно параметры)                 
    }

};


и есть функц.

template<class T>
sorter<T> maker(T &t)
{
 return sorter(t);
}


и соответственно вызов.

m_list_for_sort.sort(maker(std::less<int>()));

так вот.
maker получает функцианальный опект и
передает его в конструктор sorter тот в свою очередь иницализует обект
t. и вызеватся в конечном итоге оператор () структуры less.
собственно вопрос.
можно ли в конструктор sorter не сам обект а указател на него.
и вызвать не через обект t а через этот указатель?
Re: получить адресс предиката
От: remark Россия http://www.1024cores.net/
Дата: 26.09.07 10:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>можно ли в конструктор sorter не сам обект а указател на него.

А>и вызвать не через обект t а через этот указатель?

Можно и по указателю и по ссылке.
Временный объект std::less<int> будет жить до конца выполнения sort.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: получить адресс предиката
От: Кодт Россия  
Дата: 26.09.07 10:12
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>maker получает функцианальный опект и передает его в конструктор sorter

А> тот в свою очередь иницализует обект t.
А> и вызеватся в конечном итоге оператор () структуры less.

А>собственно вопрос.

А>можно ли в конструктор sorter не сам обект а указател на него.
А>и вызвать не через обект t а через этот указатель?

А тебе что, жалко, что объект по значению передаётся? Он же маленький, а его operator() вообще инлайнится и сведётся к вызову встроенного оператора <(int,int).

Ну а передавать по указателю — пожалуйста.
template<class F>
struct call2_by_ptr
    : binary_function< typename F::first_argument_type, typename F::second_argument_type, typename F::result_type >
{
    F* pf_;
    call2_by_ptr(F* pf) : pf_(pf) {}
    
    result_type operator()(first_argument_type x, second_argument_type y) const
    {
        return (*pf_)(x,y);
    }
}

template<class F>
call2_by_ptr fun(F* pf) { return call2_by_ptr<F>(pf); }

template<class T>
auto_ptr<T> ap(T* p) { return auto_ptr<T>(p); }

.....
the_list.sort(fun(ap(new less<int>()).get()));
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: получить адресс предиката
От: remark Россия http://www.1024cores.net/
Дата: 26.09.07 10:28
Оценка:
Здравствуйте, Кодт, Вы писали:

К>the_list.sort(fun(ap(new less<int>()).get()));


Имхо тут не обязательно создавать предикат динамически, можно просто запомнить ссылку на исходный временный объект.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: получить адресс предиката
От: Кодт Россия  
Дата: 26.09.07 10:40
Оценка:
Здравствуйте, remark, Вы писали:

R>Имхо тут не обязательно создавать предикат динамически, можно просто запомнить ссылку на исходный временный объект.


Согласен
the_list.sort(fun(&less<int>()));
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.