2015-12-11 63 views
0

Linked Question如何避免匹配Boost Variant返回類型?

假設我們有:

boost::variant<nil, std::string, string_struct> 

而且,

struct string_struct 
{ 
    string_struct(std::string const& name = "") : name(name) {} 
    std::string name; 
} 

有沒有一些方法來阻止編譯器錯誤地推斷錯誤的升壓變量類型?

更從理論上說,如果我們有一個

boost::variant<std::string, std::string> 

我不認爲這將彙編。然而,第一個例子會。問題是,我們如何保證不返回類型的衝突?具體來說,當作爲解析器的一部分使用時,有無數的實例需要第一個示例。所以...

+0

爲什麼不只是'var = string_struct(string_param);'如果你知道你想初始化一個'string_struct'而不是'string' – SirGuy

+2

此外,你可以使構造函數爲'explicit',並去除隱式轉換從'const std :: string&'。 – melak47

+0

哦,是的,我猜我的評論沒有解決嘗試初始化字符串變體的問題......使構造函數明確將解決這個問題,使我的第一個評論成爲必要性而不僅僅是一個建議。 – SirGuy

回答

1

此代碼未經測試,但我相信這會解決您的問題。

struct string_struct 
    { 
     explicit string_struct(const std::string & s):name(s){} 
    }; 

    typedef boost::variant<nil, std::string, string_struct> var_t; 

    var_t v1 = std::string("Hello"); 
    var_t v2 = string_struct("Hello"); 

var1將被明確地初始化持有字符串,因爲構建string_struct你必須明確地調用它的構造函數。當然,var2將被初始化爲保存一個string_struct,因爲這是你傳遞給變體的東西。

編輯

好了,有很多的類型信息缺少有關規則(S)和結構()你加入,所以我要繼續前進,並說,這些應該被添加到你的問題。我終於在上一個問題中找到了定義。

無視此刻,我現在最好的猜測是,如何讓標識符的規則返回一個實際的標識符而不是一個字符串(它真的令人困惑的是有一個標識符類型和一個標識符規則順便說一句,但我意識到你不是那樣做的人)。

EDIT 2

而不是張貼其他評論,我會把它放在這裏:

你有qi::rule<Iterator, std::string(), skipper<Iterator> > identifier;,其中宣佈該規則爲std::string的返回類型。將其更改爲qi::rule<Iterator, identifier(), skipper<Iterator> > identifier;,它聲明規則的返回類型爲identifier。請注意從std::stringidentifier的變化。讓我知道這是否對你有幫助,或者你是否已經做到了。

+0

所以,問題是我需要string_struct來保留它的數據成員'名稱'。 –

+0

我不確定你的意思,在你的例子中你的'string_struct'包含一個用於構造它的字符串的副本,我的例子也是如此。我不確定你想要怎麼做才能做到這一點...... – SirGuy

+0

'name'在你的例子中來自哪裏? –

相關問題