Как сделать так, чтобы приложение-посетитель не сбрасывало квалификатор const?

Можно ли написать const функция с apply_visitor внутри? Например, этот код компилируется без ошибок:

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <boost/variant.hpp>
using namespace std;

typedef boost::variant<int,string> vTypeVariants;

struct vType_toN : boost::static_visitor<int>
{
    int operator()(int& i) const {
        return i;
    }
    int operator()(const string& str) const{
        return str.length();
    }
};

class vType{
public:
    vType(const int& src) : data(src){}
    vType(const std::string& src) : data(src){}

    int getLength(){
        return boost::apply_visitor(vType_toN(),data);
    }
private:
    vTypeVariants data;
};

int main(int argc, char ** argv)
{
  vType x = string("2");
  printf("L=%d",x.getLength());
  return(0);
}

Если вы не добавите const в getLength():

int getLength() const{
        return boost::apply_visitor(vType_toN(),data);
}

В этом случае появляется ошибка с обширным описанием (2 страницы) с жалобой на проблему с инициализацией первого аргумента.

Итак, вопрос: как использовать apply_visitor внутри функции const?

1 ответ

Узнал сам. Забыл const перед int в определении оператора класса static_visitor. Может быть, кто-то найдет это полезным, так как это было нелегко выяснить (мой первоначальный класс намного больше).

Другие вопросы по тегам