сортировка задач с помощью функции членства в качестве компаратора

попытка скомпилировать следующий код, я получаю эту ошибку компиляции, что я могу сделать?


C++ ISO запрещает взятие адреса неполного или заключил нестатическую функцию членства в скобки для формирования указателя на функцию членства.

class MyClass {
   int * arr;
   // other member variables
   MyClass() { arr = new int[someSize]; }

   doCompare( const int & i1, const int & i2 ) { // use some member variables } 

   doSort() { std::sort(arr,arr+someSize, &doCompare); }

}; 
28
задан Navid 14 December 2009 в 17:31
поделиться

3 ответа

Как говорит Андреас Бринк, doCompare должен быть статическим (+1). Если вам НЕОБХОДИМО иметь состояние в вашей функции компаратора (используя другие члены класса), тогда вам лучше использовать функтор вместо функции (и это будет быстрее):

class MyClass{

   // ...
   struct doCompare
   { 
       doCompare( const MyClass& info ) : m_info(info) { } // only if you really need the object state
       const MyClass& m_info;

       bool operator()( const int & i1, const int & i2  )
       { 
            // comparison code using m_info
       }
   };

    doSort() 
    { std::sort( arr, arr+someSize, doCompare(*this) ); }
};

Использование функтора всегда лучше, просто дольше печатать (это может быть неудобно, ну да ладно ...)

Я думаю, вы также можете использовать std :: bind с функцией-членом, но я не уверен, как это сделать, и это все равно будет нелегко прочитать .

ОБНОВЛЕНИЕ 2014: Сегодня у нас есть доступ к компиляторам C ++ 11, так что вместо этого вы можете использовать лямбда, код будет короче, но будет иметь ту же семантику.

13
ответ дан 28 November 2019 в 03:04
поделиться

Есть способ делать то, что вы хотите, но вам нужно использовать небольшой адаптер. Поскольку STL не пишет это за вас, можете написать это сами:

template <class Base, class T>
struct adaptor_t
{
  typedef bool (Base::*method_t)(const T& t1, const T& t2));
  adaptor_t(Base* b, method_t m)
    : base(b), method(m)
  {}
  adaptor_t(const adaptor_t& copy) : base(copy.base), method(copy.method) {}
  bool operator()(const T& t1, const T& t2) const {
    return (base->*method)(t1, t2);
  }
  Base *base;
  method_t method;
}
template <class Base, class T>
adaptor_t<Base,T> adapt_method(Base* b, typename adaptor_t<Base,T>::method_t m)
{  return adaptor_t<Base,T>(b,m); }

Затем вы можете использовать его:

doSort() { std::sort(arr,arr+someSize, adapt_method(this, &doCompare)); }
2
ответ дан 28 November 2019 в 03:04
поделиться

См. также Может ли существующий огромный приложение будет перенесено в сеть? но он может получить доступ к простой функции C с помощью Pinvoke, поэтому, что бы вы ни делали, на сайте C ++ потребуется какой-то мостовой слой.

  • Посмотрите, можете ли вы использовать Silverlight вместо Интернета, если вы можете (проблемы с установкой и т. ) это сэкономит вам много времени на разработку. (И также позволяет настраивать таргетинг на телефоны Microsoft.)
  • Убедитесь, что бизнес-модель «порта в Интернет» очень сильна, и это займет намного больше времени, чем вы думаете! , Хостинг с сервер терминалов и т. д. вариант для ваших клиентов ?
  • Подумайте о многопоточности и многопользовательском доступе, например, ваша dll предполагает, что она используется только одним пользователем?
  • Просто потому, что вы работаете над новая веб-версия, вы по-прежнему будете получать клиентов, требующих изменений в настольной версии, даже после того, как вы отправите веб-версию. Если doCompare требуются данные из MyClass , вы можете превратить MyClass в функтор сравнения, заменив:

    doCompare( const int & i1, const int & i2 ) { // use some member variables } 
    

    на

    bool operator () ( const int & i1, const int & i2 ) { // use some member variables } 
    

    и вызвав:

    doSort() { std::sort(arr,arr+someSize, *this); }
    

    Также, Разве doSort не пропускает возвращаемое значение?

    Я думаю, можно использовать std :: mem_fun и какую-то привязку, чтобы превратить функцию-член в бесплатную функцию , но точный синтаксис в данный момент ускользает от меня.

    EDIT: Doh, std :: sort принимает функтор по значению, что может быть проблемой. Чтобы обойти эту проблему, оберните функтор внутри класса:

    class MyClass {
        struct Less {
            Less(const MyClass& c) : myClass(c) {}
            bool operator () ( const int & i1, const int & i2 ) {// use 'myClass'} 
            MyClass& myClass;
        };
        doSort() { std::sort(arr,arr+someSize, Less(*this)); }
    }
    
  • 28
    ответ дан 28 November 2019 в 03:04
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: