У меня есть код, похожий ниже.Предварительный вариант посетителя с дополнительным параметром
typedef uint32_t IntType;
typedef IntType IntValue;
typedef boost::variant<IntValue, std::string> MsgValue;
MsgValue v;
Вместо того, чтобы сказать это,
IntValue value = boost::apply_visitor(d_string_int_visitor(), v);
Я хотел бы передать дополнительный параметр, как это: Но оператор() дает ошибку компиляции.
//This gives an error since the overload below doesn't work.
IntValue value = boost::apply_visitor(d_string_int_visitor(), v, anotherStr);
class d_string_int_visitor : public boost::static_visitor<IntType>
{
public:
inline IntType operator()(IntType i) const
{
return i;
}
inline IntValue operator()(const std::string& str) const noexcept
{
// code in here
}
//I want this, but compiler error.
inline IntValue operator()(const std::string& str, const std::string s) const noexcept
{
// code in here
}
};
Что вы хотите делать с 'anotherStr'? – P0W
Почему вы не передаете 'anotherStr' конструктору' d_string_int_visitor', а затем используете его? – Nawaz
Решения Preatorian и Yakk не являются общими; они работают только потому, что тип дополнительного параметра является одним из ограниченных типов. Это так называемое двоичное (многократное) посещение. Если дополнительный тип не был ограниченным типом, единственным решением было бы использовать конструктор и переменную-член, как указано Nawaz. – wmamrak