如何处理模板中的成员变量

时间:2016-02-09 19:08:16

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

我使用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错误,上面写着

  

&#39;身份&#39;:不是&#39; Namespace :: OtherClass&#39;的成员。

由于我只是在{是identity时处理成员SubClassIdentity并非必须是OtherClass的成员。我应该如何编写代码以避免出现编译错误?

谢谢!

1 个答案:

答案 0 :(得分:3)

无论检查事实如何

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

是一个编译时常量,编译器仍然需要编译 all 函数中的代码。如果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引用上分配成员吗?