参考https://stackoverflow.com/questions/1005476/how-to-detect-whether-there-is-a-specific-member-variable-in-class中的解决方案,利用decltype, 模板多态,std::false_type, std::true_type快速判断是否有某个名称的成员变量
template <typename T, typename = int>
struct HasX : std::false_type { };
template <typename T>
struct HasX <T, decltype((void) T::x, 0)> : std::true_type { };
struct A { int x; };
struct B { int y; };
// 有 HasX<A>::value == true and HasX<B>::value == false
后续要求,如果struct存在该变量则对其进行赋值。
如果直接出现object.para的形式,HasX<B>::value == false的情况下会报编译错误
因此考虑通过模板多态的方式,在HasX
#define DEFINECHECKPARAM(ParName, ParType) \
template <typename T, typename U = int> \
struct Has_##ParName : std::false_type{static void set(T &object, ##ParType value) {}}; \
template <typename T> \
struct Has_##ParName<T, decltype((void)T::ParName, 0)> : std::true_type{ \
static void set(T &object, ##ParType value) {object.##ParName = value;} \
};
DEFINECHECKPARAM(x, int)
#define CHECKPARAM(structName, ParName) \
Has_##ParName<structName>::value
#define SETVALUE(structName, object, ParName, value) \
Has_##ParName<structName>::set(object, value)
int main() {
STRUCTURE s;
if(CHECKPARAM(STRUCTURE, x)){
SETVALUE(STRUCTURE, s, x, 1);
print(s, x);
}
}
本文介绍了如何利用C++的decltype, 模板多态, std::false_type, std::true_type来判断类中是否存在特定的成员变量,并在存在时进行赋值。在遇到HasX<B>::value为false时,会避免直接使用object.para引发的编译错误,采用模板多态的解决方案。"
132386901,19695037,解决OpenCV错误:!empty in function的详细步骤与示例,"['OpenCV', '计算机视觉', 'C/C++']
1166

被折叠的 条评论
为什么被折叠?



