重写类型以使用boost::recursive_wrapper,而不是boost::make_recurive变体

Rewrite type to use boost::recursive_wrapper instead of boost::make_recursive variant

本文关键字:boost make 变体 recurive wrapper 类型 recursive 重写      更新时间:2023-10-16

我有这种类型的

using expression = boost::make_recursive_variant<
    number,
    std::tuple<
        boost::recursive_variant_,
        binary_operator,
        boost::recursive_variant_
    >
>;

binary_operator是什么并不重要,因为这种类型不能正常工作使用boost::make_recurive_variant和元组

编辑:实际上我不知道为什么它不起作用。事实证明,我链接的问题答案中提到的pull请求已合并为boost 1.56.0,这意味着问题出在其他地方。下面是一个显示问题的最小程序:

#include <boost/variant.hpp>
#include <boost/variant/recursive_variant.hpp>
#include <tuple>
struct A {};
struct B {};
using working_variant = boost::variant<
    A,
    B
>;
using not_working_variant = boost::make_recursive_variant<
    A,
    std::tuple<
        boost::recursive_variant_,
        B,
        boost::recursive_variant_
    >
>;
int main() {
    working_variant x = A();
    not_working_variant y = A();
}

以及编译错误:

$ clang++ -stdlib=libc++ -std=c++14 -isystem ~/soft/boost_1_56_0/ min.cpp 
min.cpp:25:25: error: no viable conversion from 'A' to 'not_working_variant' (aka 'make_recursive_variant<A, std::tuple<boost::recursive_variant_, B,
      boost::recursive_variant_> >')
    not_working_variant y = A();
                        ^   ~~~
/home/crabman/soft/boost_1_56_0/boost/variant/recursive_variant.hpp:176:8: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from
      'A' to 'const boost::make_recursive_variant<A, std::__1::tuple<boost::recursive_variant_, B, boost::recursive_variant_>, boost::detail::variant::void_,
      boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_,
      boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_,
      boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_,
      boost::detail::variant::void_, boost::detail::variant::void_> &' for 1st argument
struct make_recursive_variant
       ^
/home/crabman/soft/boost_1_56_0/boost/variant/recursive_variant.hpp:176:8: note: candidate constructor (the implicit move constructor) not viable: no known conversion from
      'A' to 'boost::make_recursive_variant<A, std::__1::tuple<boost::recursive_variant_, B, boost::recursive_variant_>, boost::detail::variant::void_,
      boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_,
      boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_,
      boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_,
      boost::detail::variant::void_, boost::detail::variant::void_> &&' for 1st argument
struct make_recursive_variant
       ^
1 error generated.

所以我想我应该重写它,改为使用boost::recursive_wrapper。但是我该怎么做呢?我不能正向声明一个类型,它将用"using"或"typedef"定义,对吗?

忽略我在问题中写的所有内容。事实证明,你需要使用::type来定义一些带有boost::make_recurive_variant:的类型

using working_variant = boost::variant<
    A,
    B
>;
using working_recursive_variant = boost::make_recursive_variant<
    A,
    B
>::type;

即使对于使用实际递归和std::元组的代码也是如此。