这个访问者实现是不是正确?

Posted

技术标签:

【中文标题】这个访问者实现是不是正确?【英文标题】:Is this visitor implementation correct?这个访问者实现是否正确? 【发布时间】:2014-11-06 15:27:11 【问题描述】:

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

请注意我的问题如下:

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.
    
;

【问题讨论】:

我很难理解你的问题,即使阅读了几次。您能否提供一个更完整的示例来说明您正在尝试做什么? @MarkB 非常简单,我正在一个更复杂的场景中实现一个访问者,我在问题中出现了这个,我遇到了一些奇怪的错误。因此,为了放弃一些可能性,我想知道使用 const T& 专门化 static_visitor 模板是否有任何问题。我期待一些专家给我答案:不,那不应该给你任何问题。或者也许:是的,当你这样做时,会发生(...)。感谢您提前关注。 【参考方案1】:

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

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

背景及说明

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

所以如果get_somet_t() 返回T&amp;T const&amp;(或具有合适的隐式转换的东西)就没有问题。

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

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

【讨论】:

添加了一个与您的原始案例非常相似的演示,即使在 Demonstration 下使用非常量引用

以上是关于这个访问者实现是不是正确?的主要内容,如果未能解决你的问题,请参考以下文章

将“反馈表”命名为网站访问者可以填写的任何 html 表单是不是正确?

正确理解ThreadLocal

转载正确理解ThreadLocal

这个 JWT 实现是不是可以防止 XSS 和 CSRF 攻击,同时仍然允许我访问有效负载?

我是不是正确理解用于身份验证的访问和刷新令牌技术?

正确实现 JWT