Jestem świadkiem zachowania w następującym kodzie, którego nie rozumiem. Chodzi o to, że jeśli Oświadczam drugiego przeciążenie operator()
jak jedną z następujących czynności:boost :: variant - Dlaczego parametr szablonu ma wyższy priorytet niż parametr ciągu stałego
bool operator()(T other) const
bool operator()(const T &other) const
Wyjście programu jest:
ciąg
Ale jeśli mogę użyć następujących deklaracja:
bool operator()(T &other) const
Dane wyjściowe będą następujące:
inny rodzaj
Czy ktoś mógłby wyjaśnić, dlaczego operator()(const string &other)
nie jest nazywany w tym ostatnim przypadku?
#include "boost/variant/variant.hpp"
#include "boost/variant/apply_visitor.hpp"
using namespace std;
using namespace boost;
typedef variant<string, int> MyVariant;
class StartsWith
: public boost::static_visitor<bool>
{
public:
string mPrefix;
bool operator()(const string &other) const
{
cout << "string" << endl;
return other.compare(0, mPrefix.length(), mPrefix) == 0;
}
template<typename T>
bool operator()(T &other) const
{
cout << "other type" << endl;
return false;
}
StartsWith(string const& prefix):mPrefix(prefix){}
};
int main(int argc, char **argv)
{
MyVariant v(string("123456"));
apply_visitor(StartsWith("123"), v);
return 0;
}
Jako maniak typu, powiedziałbym, że rozwiązanie ** 3rd ** to ** best **, as-in: ** const-correct **. Nie ma powodu, aby przyjmować parametr przez odniesienie do stałych, jeśli nie zamierzasz go modyfikować. –
@ MatthieuM. W tym przypadku masz rację.Nie wspomniałem o "T &&" - prawdopodobnie byłby najlepszy - ale jest wiele postów w SO mówiących o różnicy między 'T &&' i' const T & ', więc nie chciałem tworzyć tu niepotrzebnego miksu ... – PiotrNycz