我正在使用 boost fusion 库来读取结构中的所有成员。 Identity
是 Namespace::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
不必是 的成员>其他类
。我应该如何编写我的代码才不会出现此编译错误?
谢谢!
最佳答案
不考虑支票
if (std::is_same<T, Namespace::SomeClass>::value)
是一个编译时常量,编译器还是要编译所有函数中的代码。如果 Identity
只是 T
的成员,如果该检查为真,那么如果该检查失败,它显然无法编译。您必须将其移动到不同的功能中。最简单的方法是标签分派(dispatch):
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 ?
}
或者在这种情况下,由于我们正在检查特定类型,甚至不需要标签分派(dispatch),可以只提供非模板重载:
zero_out(v);
template <class T>
void zero_out(T const& ) { }
void zero_out(Namespace::SomeClass const& v) {
v.Identity = 0;
}
旁注,您要在 const 引用上分配成员?
关于c++ - 如何处理模板中的成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35300242/