Допустим, у меня есть
boost::variant<std::string, int> myVariant;
В этом объекте я храню данные из базы данных, которая обычно является целочисленной или текстовой, но иногда это время хранится в базе данных в виде текста.
Поэтому мне интересно, смогу ли я создать посетителя, который при посещении варианта объекта со строкой в нем возвращает структуру типа 'tm'. Примерно так:
class timeVisitor : public boost::static_visitor<boost::shared_ptr<tm> >
{
public:
boost::shared_ptr<tm> operator()(string &str) const
{
boost::shared_ptr<tm> dst(new tm());
strptime(str.c_str(), "%Y-%m-%d", dst.get());
return dst;
}
};
Тогда, чтобы использовать его:
boost::shared_ptr<tm> result = boost::apply_visitor( timeVisitor(), myVariant );
Дело в том, что я не хочу создавать структуру tm для посетителя и возиться с некоторыми общими указателями и прочим. Я предпочитаю отдавать уже созданный посетителю, а внутри просто для инициализации.
Что-то вроде (в смысле использования):
tm result;
int returnCode = boost::apply_visitor( timeVisitor(result), myVariant );
Посетитель просто инициализирует с помощью strptime мой результат tm struct и даже вернет его, если возникла проблема с преобразованием в returnCode.
Кто-нибудь знает, как этого можно достичь? Можно ли как-то определить посетителя, который принимает два параметра ... или, может быть, что-то еще?