2012-10-18 22 views
9
typedef boost::variant<int, double> Type; 
class Append: public boost::static_visitor<> 
{ 
public: 
    void operator()(int) 
    {} 

    void operator()(double) 
    {} 

}; 

Type type(1.2); 
Visitor visitor; 
boost::apply_visitor(visitor, type); 

Có thể thay đổi người truy cập như vậy mà nó nhận dữ liệu thêm như sau:boost :: static_visitor với nhiều đối số

class Append: public boost::static_visitor<> 
{ 
public: 
    void operator()(int, const std::string&) 
    {} 

    void operator()(double, const std::string&) 
    {} 
}; 

Chuỗi này thay đổi giá trị trong suốt cuộc đời của đối tượng Nối. Việc truyền chuỗi trong thông qua hàm tạo không phải là một tùy chọn trong trường hợp này.

+0

Tại sao nó không phải là một lựa chọn? Bạn có thể tạo một đối tượng chắp thêm với các chuỗi khác nhau trong trường hợp thay đổi. – kennytm

+0

Giá trị chuỗi sẽ thay đổi vào thời gian nào? Tôi không thấy lý do tại sao nó không thể được thực hiện với một nhà xây dựng không. – Mene

+0

@KennyTM Lớp Append có một số phụ thuộc thông qua hàm tạo của nó. Nếu tôi xây dựng lại đối tượng Append trong lớp của tôi, thì lớp này cũng sẽ cần phải thực hiện tất cả các phụ thuộc được sử dụng bởi Append thông qua hàm tạo của nó. Tôi đã hy vọng rằng lớp của tôi sẽ đơn giản lấy một đối tượng Append thông qua hàm tạo của nó. – Baz

Trả lời

14

"Đối số bổ sung" được nhận cho mỗi cuộc gọi là con trỏ this. Sử dụng nó để chuyển bất kỳ thông tin bổ sung nào bạn cần:

#include <boost/variant.hpp> 
typedef boost::variant<int, double> Type; 
class Append: public boost::static_visitor<> 
{ 
public: 
    void operator()(int) 
    {} 

    void operator()(double) 
    {} 
    std::string argument; 
}; 

int main() { 
    Type type(1.2); 
    Append visitor; 
    visitor.argument = "first value"; 
    boost::apply_visitor(visitor, type); 
    visitor.argument = "new value"; 
    boost::apply_visitor(visitor, type); 
} 
+1

Nếu cần thiết, thành viên không cần phải là 'std :: string' nhưng có thể là một 'std :: string *' do đó có thể được phục hồi. –

+0

@LucDanton: Thật vậy - có nhiều biến thể có thể có trong ý tưởng chung này, tùy thuộc vào nhu cầu chính xác của tình huống. – Mankarse

Các vấn đề liên quan