2013-04-27 37 views
1

我應該怎麼做申報前A,代表元素B清單列表,每個指C,即boost::recursive_wrapper -s到A未便向前聲明表示元素

特別感興趣的是,何時所有類型都是模板化的。再說了,

template< typename F > struct expression 
    : tagged, boost::spirit::extended_variant< 
      nil, 
      F, 
      boost::recursive_wrapper< expression_list<F> 
     > > 
    {...}; 

然後應該是什麼expression_list

template< typename F > struct expression; 
template< typename F > 
using expression_list = std::list< expression<F> >; 
... // definition of template< typename F > expression; here 

不能boost::recursive_wrapper的模板參數列表中使用,但在

template< typename F > 
struct expression_list; 
... // definition of template< typename F > expression; here 
template< typename F > 
struct expression_list 
    : std::list< expression<F> > 
{ ; } 

萬一有static_assert(!std::has_virtual_destructor< std::list< expression<F> > >::value, "has virtual destructor"),因此,不能太習慣。

+0

嗯?特別不清楚你打算如何使用......任何事情。你爲什麼不用評論發佈代碼,而不是描述你沒有展示的代碼的「散文」? – sehe 2013-04-27 11:48:04

回答

1

我不知道你問什麼,但下面的示例定義使用例子似乎爲我工作的罰款(考慮使轉換構造explicit在現實生活中,雖然):

#include <list> 
#include <boost/variant/recursive_wrapper.hpp> 
#include <boost/spirit/include/qi.hpp> 
#include <boost/spirit/include/support_extended_variant.hpp> 

struct nil{}; 

template< typename F > struct expression; 
template< typename F > 
using expression_list = std::list< expression<F> >; 

template< typename F > 
using expression_base = boost::spirit::extended_variant< 
      nil, 
      F, 
      boost::recursive_wrapper< expression_list<F> 
     > >; 

template< typename F > 
struct expression : expression_base<F> 
    { 
     template <typename I> 
      expression(I&& i) 
      : expression_base<F>(std::forward<I>(i)) 
     {} 

     expression(std::initializer_list<F> l) 
      : expression_base<F>(expression_list<F>{l}) {} 
    }; 


int main() 
{ 
    auto v = expression<int> (42); 
    v = expression<int> { 1, 2, 3, 42 }; 

    v = 43; 
    v = { 2, 3, 4, 43 }; 
}