Tôi đang chứng kiến một hành vi trong đoạn mã sau mà tôi không hiểu. Vấn đề là nếu tôi khai báo quá tải thứ hai của operator()
như một trong hai điều sau đây:boost :: variant - Tại sao tham số mẫu có ưu tiên cao hơn tham số chuỗi const
bool operator()(T other) const
bool operator()(const T &other) const
Kết quả của chương trình là:
chuỗi
Nhưng nếu tôi sử dụng sau đây khai báo:
bool operator()(T &other) const
Kết quả sẽ là:
loại khác
Ai đó có thể vui lòng giải thích lý do tại sao operator()(const string &other)
không được gọi trong trường hợp sau?
#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;
}
Là một loại freak, tôi sẽ nói rằng giải pháp ** 3 ** là ** tốt nhất **, as-in: ** const-correct **. Không có lý do để lấy tham số bằng tham chiếu không const nếu bạn không sửa đổi nó. –
@MatthieuM. Trong trường hợp này, bạn đúng.Tôi đã không đề cập đến 'T &&' - có lẽ nó sẽ là tốt nhất - nhưng có rất nhiều bài viết SO thảo luận về sự khác biệt giữa 'T &&' và 'const T &' vì vậy tôi không muốn tạo ra hỗn hợp không cần thiết ở đây ... – PiotrNycz