这个问题是基于这篇文章。
目标:我想知道一个类是否有成员变量x。我想收到true无论此变量是否为private,public或protected。
方法:如果类有成员变量,您可以使用以下代码获取信息:
template <typename T, typename = int>
struct HasX : std::false_type { };
template <typename T>
struct HasX <T, decltype((void) T::x, 0)> : std::true_type { };
Run Code Online (Sandbox Code Playgroud)
使用它
if constexpr (HasX<my_class>::value) {
// do stuff with x
} else {
// ...
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在这种情况下不起作用
struct my_class {
private:
int x;
};
Run Code Online (Sandbox Code Playgroud)
我怎样才能使这项工作?我想HasX<my_class>::value是true。
想法:
使用friend可以访问T::x. 这似乎不起作用。看看这个活生生的例子。