我使用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错误,上面写着
&#39;身份&#39;:不是&#39; Namespace :: OtherClass&#39;的成员。
由于我只是在{是identity
时处理成员SubClass
,Identity
并非必须是OtherClass
的成员。我应该如何编写代码以避免出现编译错误?
谢谢!
答案 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引用上分配成员吗?