Ich habe Code, der unten ähnelt.Boost Variante Besucher mit einem zusätzlichen Parameter
typedef uint32_t IntType;
typedef IntType IntValue;
typedef boost::variant<IntValue, std::string> MsgValue;
MsgValue v;
Statt dies zu sagen:
IntValue value = boost::apply_visitor(d_string_int_visitor(), v);
Ich möchte einen zusätzlichen Parameter wie folgt weitergeben müssen: Aber Operator() gibt einen Compiler-Fehler.
//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
}
};
Was möchten Sie mit 'anotherStr' machen? – P0W
Warum übergibt man 'anotherStr' an den Konstruktor von' d_string_int_visitor' und benutzt es dann? – Nawaz
Lösungen von Preatorian und Yakk sind nicht generisch; Sie funktionieren nur, weil der Typ des zusätzlichen Parameters einer der beschränkten Typen ist. Dies ist so genannte binäre (Multi) Visitation. Wenn der zusätzliche Typ kein beschränkter Typ wäre, wäre die einzige Lösung, den Konstruktor und die Elementvariable zu verwenden, wie von Nawaz hervorgehoben. – wmamrak