【问题标题】:How to handle member variables in template stuff如何处理模板中的成员变量
【发布时间】:2016-02-09 19:08:15
【问题描述】:

我正在使用 boost fusion 库来遍历结构中的所有成员。 IdentityNamespace::SomeClass 的成员。通过一些递归操作,v 最终会成为一个Namespace::SomeClass 对象。进入if语句后,我希望能够处理SomeClass的成员对象。

template<typename T>
void Function(T const& v)
{
    typedef boost::mpl::range_c<unsigned, 0, boost::fusion::result_of::size<T>::value > T_members;
    boost::fusion::for_each(T_members(), FunctionStruct<T>(v));

    if (std::is_same<T, Namespace::SomeClass>::value)
    {
        v.Identity= "0";
    }
}

当我编译这段代码时,它给了我一个 C2039 错误提示

“身份”:不是“命名空间::OtherClass”的成员。

因为当 v 是 SubClass 时我只处理成员 identity,所以 Identity 不必是 OtherClass 的成员。我应该如何编写我的代码才能没有这个编译错误?

谢谢!

【问题讨论】:

    标签: c++ templates boost compiler-errors typetraits


    【解决方案1】:

    不管检查是什么

    if (std::is_same<T, Namespace::SomeClass>::value)
    

    是一个编译时间常数,编译器仍然要编译所有函数中的代码。如果Identity 只是T 的成员,如果该检查为真,那么如果该检查失败,它将显然无法编译。您必须将其移至不同的功能。最简单的方法是标签调度:

    zero_out(v, std::is_same<T, Namespace::SomeClass>{});
    

    与:

    template <class T>
    void zero_out(T const& v, std::true_type) {
        v.Identity = 0;
    }
    
    template <class T>
    void zero_out(T const& v, std::false_type) {
        // nothing ?
    }
    

    或者在这种情况下,由于我们正在检查特定类型,甚至不需要标签调度,只需提供非模板重载即可:

    zero_out(v);
    
    template <class T>
    void zero_out(T const& ) { }
    
    void zero_out(Namespace::SomeClass const& v) {
        v.Identity = 0;
    }
    

    旁注,您要在 const 引用上分配一个成员?

    【讨论】:

    • @XTT 不,但这不是一个最小、完整或可验证的示例,所以我不知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2021-04-21
    • 1970-01-01
    • 2014-12-11
    • 2017-01-16
    • 1970-01-01
    • 2018-07-20
    相关资源
    最近更新 更多