Добрый день.
есть вопрос.
вот есть прегикат каторый сортирует список.
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 а через этот указатель?
Здравствуйте, Аноним, Вы писали:
А>можно ли в конструктор sorter не сам обект а указател на него.
А>и вызвать не через обект t а через этот указатель?
Можно и по указателю и по ссылке.
Временный объект std::less<int> будет жить до конца выполнения sort.
Здравствуйте, <Аноним>, Вы писали:
А>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>>
Здравствуйте, Кодт, Вы писали:
К>the_list.sort(fun(ap(new less<int>()).get()));
Имхо тут не обязательно создавать предикат динамически, можно просто запомнить ссылку на исходный временный объект.
Здравствуйте, remark, Вы писали:
R>Имхо тут не обязательно создавать предикат динамически, можно просто запомнить ссылку на исходный временный объект.
Согласен
the_list.sort(fun(&less<int>()));
... << RSDN@Home 1.2.0 alpha rev. 655>>