1

を参照する要素のリストをA表すforwardを宣言するにはどうすればよいですか?BCboost::recursive_wrapperA

すべての型がテンプレート化されたものである場合に特に関心があります。言う、

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")、したがって、あまりにも使用することはできません。

4

1 に答える 1

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 };
}
于 2013-04-27T12:05:26.500 に答える