2012-10-18 30 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); 

是否有可能改變這種訪問者它接收如下額外的數據:的boost :: static_visitor使用多個參數

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

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

追加對象的生命週期過程中,該字符串值的變化。在這種情況下,通過構造函數傳遞字符串不是一個選項。

+0

爲什麼它不是一個選項?如果發生更改,可以使用不同的字符串創建另一個Append對象。 – kennytm

+0

什麼時候字符串值會改變?我不明白爲什麼它不能用構造函數來完成。 – Mene

+0

@KennyTM Append類通過它的構造函數獲取一些依賴關係。如果我在我的類中重建Append對象,那麼這個類也需要通過構造函數獲取Append使用的所有依賴項。我曾希望我的課程通過它的構造函數簡單地接受一個Append對象。 – Baz

回答

14

是被賦予給每個呼叫的「附加參數」是this指針。用它來傳遞你需要的任何附加信息:

#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

如果需要,該成員不需要是「std :: string」,但可以是例如一個'std :: string *'可以被反彈。 –

+0

@LucDanton:的確 - 在這個總體思路上有很多可能的變化,取決於具體情況的確切需要。 – Mankarse