1
我想創建一個訪問者的工廠,返回的這些類型的對象:工廠返回的boost ::訪問者對象
class Visitor1: public boost::static_visitor<int>
{
public:
int operator()(int&) const
{
return 1;
}
int operator()(bool&) const
{
return 1;
}
};
class Visitor2: public boost::static_visitor<int>
{
public:
int operator()(int&) const
{
return 2;
}
int operator()(bool&) const
{
return 2;
}
};
我認爲,我可以返回一個類型爲boost指針:: static_visitor *對於工廠創建的對象,但這不能編譯。我也可以有對象的引用,如下所示:
Visitor1 v;
Type t;
boost::static_visitor<int>& vR = v;
boost::apply_visitor(vR, t);
我得到的錯誤是:
see reference to function template instantiation 'int boost::apply_visitor<boost::static_visitor<R>,Type>(Visitor &,Visitable &)' being compiled
1> with
1> [
1> R=int,
1> Visitor=boost::static_visitor<int>,
1> Visitable=Type
1> ]
1>c:\boost_1_49_0\boost\variant\variant.hpp(858): error C2064: term does not evaluate to a function taking 1 arguments
我應該如何執行我的工廠?
謝謝!我還留下了一個可以用來解決這個問題的界面。但是,我只適用於您提到的可能類型的子集。我曾計劃使用模板來捕獲與特定訪客實現無關的所有類型,但不能混合使用虛擬模板和模板。我該如何解決這個問題,還是需要針對與特定訪客實施無關的每種類型調用斷言。 – Baz
你的意思是我應該用一個虛擬函數來替換基類中的每個純虛函數,這個虛函數會拋出一個異常? – Baz
@Baz雖然無法調用模板化的operator()'virtual,但可以使用'visitor_base :: operator()'將其引入派生訪問者的範圍。 – pmr