Ho un codice simile al seguente.Aumenta visitatore variante con un parametro aggiuntivo
typedef uint32_t IntType;
typedef IntType IntValue;
typedef boost::variant<IntValue, std::string> MsgValue;
MsgValue v;
Invece di dire questo,
IntValue value = boost::apply_visitor(d_string_int_visitor(), v);
vorrei passare un parametro in più in questo modo: Ma operator() dà un errore di compilazione.
//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
}
};
Cosa vuoi fare con 'anotherStr'? – P0W
Perché non passi 'anotherStr' al costruttore di' d_string_int_visitor' e poi usalo? – Nawaz
Le soluzioni di Preatorian e Yakk non sono generiche; funzionano solo perché il tipo del parametro extra è uno dei tipi limitati. Questa è la cosiddetta visita multipla (multi). Se il tipo extra non era un tipo limitato, l'unica soluzione sarebbe utilizzare la variabile costruttore e membro, come sottolineato da Nawaz. – wmamrak