声明转发应该怎么办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/