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

How to handle member variables in template stuff

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

'Identity': is not a member of 'Namespace::OtherClass'.

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

谢谢!

不考虑支票

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 引用上分配成员?