Шаблонная мета-магия C++, механизм вывода квалификационных оценок шаблонного сайта вызова

Я извиняюсь за многословность этого примера, я придумал его из проекта. Комментарии 1 и 2 важны в следующем коде.

#include <boost/intrusive/set.hpp>

struct x : public boost::intrusive::set_base_hook<>
{
    int y;
};

struct finder
{
    bool operator()(const int & i, const x & _x) const
    { return i < _x.y;}
    bool operator()(const x & _x, const int & i) const
        { return _x.y < i;}
};

class trampoline
{
public:
    void bounce() const /* item 1 */
    {
        /*item 2*/
        boost::intrusive::set<x>::iterator it = _set.find(1,finder()); 
    }

    boost::intrusive::set<x> _set;
};

int main()
{
    trampoline t;
    t.bounce();
}

Я не могу взять неконстантный итератор в свой контейнер-член (пункт 2), где функция в области видимости является константой, если я переключаю итератор на константный итератор, все работает нормально, или если я делаю включающую функцию неконстантной, она также работает, Имеет смысл, теперь, после часа обратного инжиниринга, проблема из следующего сообщения об ошибке:

test.cc: В функции-член 'void trampoline::bounce() const':test.cc:21: ошибка: преобразование из 'boost:: intrusive:: tree_iterator , (boost:: intrusive:: link_mode_type) 1u, boost:: intrusive:: default_tag, 3 >, std:: less , long unsigned int, true>>, true> 'для нескалярного типа' boost:: intrusive:: tree_iterator , (boost:: intrusive:: link_mode_type) 1u, boost:: intrusive:: default_tag, 3>, std:: less , long unsigned int, true>>, false> 'запрошено

Что в итоге привело меня к следующему определению шаблона (/include/boost/intrusive/detail/tree_node.hpp +72):

/////////////////////////////////////////////////////////////////////////////
//                                                                         //
//                   Implementation of the tree iterator                   //
//                                                                         //
/////////////////////////////////////////////////////////////////////////////

// tree_iterator provides some basic functions for a 
// node oriented bidirectional iterator:
template<class Container, bool IsConst>

Достаточно сказать, что я решил проблему вскоре после....

Как, черт возьми, этот шаблон проходит IsConst с места вызова функции включения? Мой мозг готов взорваться (насколько я знаю, это что-то простое, но я озадачен). Было бы полезно подробное объяснение с пошаговой реализацией для объяснения механики.

У меня есть похожий вопрос, похожий на вывод типов / псевдоним шаблонного механизма C++. ссылки приветствуются, но их необходимо объединить в знания:D. Если у вас есть терпение ответить на этот вопрос, вы можете попытаться сформировать беседу по другому вопросу.

2 ответа

Решение

Не является ли функция find() членом boost::intrusive::set просто есть постоянная и неконстантная перегрузка? Я имею в виду, вот как я бы это сделал:

template <typename T /*...*/ >
class set {
  //... 
  public:
    template <bool isConst>
    class iterator {
      //....
    };
    iterator<true> find(/*..*/) const; //notice the const
    iterator<false> find(/*..*/);      //notice no const
};

Это на самом деле не магия метапрограммирования, а просто старая доброта.

Как это?

Foo<false> bar();
Foo<true> bar() const;
Другие вопросы по тегам