私が理解できない以下のコードで動作を見ています。boost :: variant - テンプレートパラメータがconst文字列パラメータよりも優先順位が高い理由
bool operator()(T other) const
bool operator()(const T &other) const
プログラムの出力は次のとおりです:ポイントは、私は、次のいずれかのようなoperator()
の2番目のオーバーロードを宣言した場合ということです
文字列
しかし、私は次のように使用している場合宣言:
bool operator()(T &other) const
出力は
他のタイプ
operator()(const string &other)
は、後者の場合には呼び出されていない理由を誰かが説明していただけますか?
#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;
}
タイプフリークとして、私は、**第3の解決策は**最高の**と言いたいと思います。** const-correct **。パラメータを変更しない場合は、非const参照によってパラメータを取得する必要はありません。 @MatthieuM。 –
。この場合、あなたは正しいです。私は 'T &&'について言及していませんでした。おそらくそれがベストでしょうが、 'T &&'と 'const T&'の違いについて議論しているところがたくさんあります。 – PiotrNycz