Tôi đã khai báo một số boost::variant
chấp nhận ba loại: string
, bool
và int
. Đoạn mã sau cho thấy biến thể của tôi chấp nhận const char*
và chuyển đổi nó thành bool
. Có phải hành vi bình thường đối với boost::variant
để chấp nhận và chuyển đổi các loại không có trong danh sách của nó?boost :: variant - tại sao "const char *" được chuyển thành "bool"?
#include <iostream>
#include "boost/variant/variant.hpp"
#include "boost/variant/apply_visitor.hpp"
using namespace std;
using namespace boost;
typedef variant<string, bool, int> MyVariant;
class TestVariant
: public boost::static_visitor<>
{
public:
void operator()(string &v) const
{
cout << "type: string -> " << v << endl;
}
template<typename U>
void operator()(U &v)const
{
cout << "type: other -> " << v << endl;
}
};
int main(int argc, char **argv)
{
MyVariant s1 = "some string";
apply_visitor(TestVariant(), s1);
MyVariant s2 = string("some string");
apply_visitor(TestVariant(), s2);
return 0;
}
đầu ra:
loại: khác -> 1
loại: string -> một số chuỗi
Nếu tôi loại bỏ các kiểu bool từ MyVariant và thay đổi nó như thế này:
typedef variant<string, int> MyVariant;
const char*
không được chuyển đổi thành bool
nữa. Lần này nó chuyển đổi sang string
và đây là sản phẩm mới:
loại: string -> một số chuỗi
loại: string -> một số chuỗi
Điều này cho thấy rằng variant
cố gắng để chuyển đổi các loại trước tiên là bool
và sau đó đến string
. Nếu việc chuyển đổi loại là điều không thể tránh khỏi và luôn luôn xảy ra, có cách nào để chuyển đổi cho string
mức độ ưu tiên cao hơn không?
Để hoàn thành giải thích của bạn: có chuyển đổi tiềm ẩn từ bất kỳ loại con trỏ nào thành 'bool' và chuyển đổi ngầm định luôn được chọn tùy theo chuyển đổi do người dùng xác định. (Việc chuyển đổi 'char *' thành 'std :: string' được tính là do người dùng định nghĩa.) Đối với việc thay đổi các hàm tạo, bạn có thể bọc lớp đó trong một lớp khác hoặc lấy ra từ lớp đó. Tùy thuộc vào ngữ cảnh, một trong những điều này có thể hoặc có thể không phù hợp; cả hai đều có một số nhược điểm. –
Tôi nghĩ rằng một giải pháp là xóa 'bool' khỏi' MyVariant' và sử dụng giá trị 0 và 1 để thay thế. – Meysam
@Meysam: vâng. Tôi nghĩ về việc giới thiệu điều đó, nhưng sau đó tôi nghĩ bạn có thể muốn một 'MyVariant' được khởi tạo với' 0' khác với 'MyVariant' được khởi tạo với' false'. Nếu không sao cho chúng giống nhau, chỉ cần xóa 'bool'. Nếu họ có ý nghĩa khác nhau, nó không phải là đơn giản. –