gpt4 book ai didi

c++ - boost::variant gettor-visitor:保存返回的引用

转载 作者:太空宇宙 更新时间:2023-11-04 13:05:51 24 4
gpt4 key购买 nike

我尝试为 boost::variant 写一个访问者它采用类型的参数包并生成 operator()对于每种类型。虽然调用了正确的函数,但在尝试将来自访问者的 get-ed 对象保存在变量中时,我仍然遇到错误。

我的访客是这样的:

#include <boost/variant.hpp>
#include <iostream>

template <class T>
class GenericGettorSpecialization
{
public:
const T& operator()(T& t)
{
std::cout << typeid(T).name() << "\n";
return t;
}
};

template <class...>
class GenericGettorSpecializationDriver;

template <>
class GenericGettorSpecializationDriver<>
{
public:
struct dummy
{
};
const dummy& operator()(const dummy&);
};

template <class Head, class... Tail>
class GenericGettorSpecializationDriver<Head, Tail...>
: protected GenericGettorSpecializationDriver<Tail...>,
protected GenericGettorSpecialization<Head>
{
public:
using GenericGettorSpecializationDriver<Tail...>::operator();
using GenericGettorSpecialization<Head>::operator();
};

template <class Head, class... Tail>
struct GenericGettor
: boost::static_visitor<>,
protected GenericGettorSpecializationDriver<Head, Tail...>
{
public:
using GenericGettorSpecializationDriver<Head, Tail...>::operator();
};

正如您在 put std::cout << typeid(T).name() << "\n"; 中出于调试目的所见在调用运算符(operator)中。

现在我是这样测试的:

int
main()
{
boost::variant<std::string, int, double> v;
GenericGettor<std::string, int, double> g;

v = "some string";
boost::apply_visitor(g, v); // prints "NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE"

v = 10;
boost::apply_visitor(g, v); // prints "i"

v = 7.3;
boost::apply_visitor(g, v); // prints "d"

auto x = boost::apply_visitor(g, v); // throws compile time error "error: variable has incomplete type 'void'"
}

显然 boost::apply_vistor返回 void , 但是我如何从 variant 中获取引用?

最佳答案

这样的 setter/getter 已经存在:boost::get<> function template .

但是,请记住变体内容是在运行时设置的,因此绝对不可能在编译时知道它。

这就是为什么您应该告诉 get 函数模板您希望它返回什么类型 - 如果此时变体不包含它,它将抛出异常。

或者,您可以使用 variant::which()成员函数,它返回当前类型的索引 - 这也是一个运行时值。

关于c++ - boost::variant gettor-visitor:保存返回的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42441003/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com