c++ - 表示元素列表的 smth 的前向声明

标签 c++ boost-spirit forward-declaration

声明转发应该怎么办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")因此,也不能使用。

最佳答案

我不确定你在问什么,但下面的示例定义用法示例似乎对我来说很好(考虑制作转换构造函数虽然在现实生活中是明确的):

#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 };
}

关于c++ - 表示元素列表的 smth 的前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16249416/

相关文章:

c++ - -Wshadow=global 将枚举类条目视为全局阴影。为什么?

c++ - 是否可以在 ChaiScript 执行中添加断点?

delphi - delphi 中程序的前向声明

c++ - 构造函数和析构函数如何工作?

c++ - 释放内存时获取 "Heap Corruption Detected: after Normal block"

c++ - 如何在不先将整个文件读入内存的情况下使用 Boost::Spirit::Lex 对文件进行 lex?

c++ - 振奋 spirit : What type names should be used for the built in terminals?

c++ - 最小化 boost::spirit 编译时间

ios - 类消息的接收方“SMClient”是前向声明

c++ - 包含后是否需要前向声明?