gpt4 book ai didi

c++ - 这个访问者实现是否正确?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:42:09 24 4
gpt4 key购买 nike

我正在实现一个访问者,以便将其与 boost 变体库 一起使用。我想知道专攻是否正确boost::static_visitor<>具有 const 引用类型。

请注意我的问题如下:

专攻有什么问题boost::static_visitor<>boost::static_visitor<const T&> ?

template<typename T>
struct my_visitor : public boost::static_visitor<const T&> {

template<typename U> const T& operator()(U& u) const {
// some code here .....
return X<U>::get_some_t(); // finally return some T.
}
};

最佳答案

只要不返回对本地/临时的引用就没有问题。

另外,一定要随着时间的推移检查引用的有效性(它在变体对象被破坏时结束,也就是当变体本身被破坏时, (!) 重新初始化时)。

背景和解释

变体包含“当前”元素类型的对象,您可以引用到该对象中。 只要变体没有重新初始化为另一种元素类型(在这种情况下,引用“只是”悬空,就像所引用对象的生命周期结束时一样)。 p>

因此,如果 get_somet_t() 返回 T&T const&(或具有适当隐式转换的内容),则没有问题。

在更简单的设置中让我演示有效的选项:

variant<int, std::string> v1 = 42;

int& i1 = get<int>(v1); // returns by ref, valid
i1 *= 2;

// now v1 contains the updated integer value 84

同样,您甚至可以制作/just references/的变体:

std::string s = "hello";
int answer = 42;

variant<int&, std::string&> v2(s);
get<std::string&>(v2) += " world"; // now s contains "hello world"

variant<int&, std::string&> v3(answer);
get<int&>(v3) *= 2; // now `answer` contains 84

查看全部 Live On Coliru


演示

另一种方式,以下是可以的:

struct A { std::string a_property; };
struct B { std::string b_field; };

struct select_member : static_visitor<std::string&> {
std::string& operator()(A& a) const { return a.a_property; }
std::string& operator()(B& b) const { return b.b_field; }
};

int main()
{
variant<A,B> v = A { "some string" };

apply_visitor(select_member(), v) += " suffix";

std::cout << get<A>(v).a_property << "\n"; // prints "some string suffix"
}

查看 Live On Coliru 也是。

关于c++ - 这个访问者实现是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26783124/

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