假设我有一个指向数据成员的指针,我想知道它是否为 const。换句话说:
struct S {
const int i; // this is const
int j;
};
在 C++ 中,我曾经做过这样的事情:
template<typename Class, typename Type, Type Class:: *>
struct is_const_data_member: std::false_type {};
template<typename Class, typename Type, const Type Class:: *Member>
struct is_const_data_member<Class, const Type, Member>: std::true_type {};
template<typename Class, typename Type, Type Class:: *Member>
void foo() {
const auto bar = is_const_data_member<Class, Type, Member>::value;
// ...
}
不过,现在有了auto
模板参数,模板参数列表就优雅多了:
template<auto Member>
void foo() {
// ...
}
在这种情况下,我发现知道数据成员是否指向 const 的唯一方法是:
const auto bar = std::is_const_v<std::remove_reference_t<decltype(std::declval<Class>().*Member)>>;
但是,它对我来说看起来很丑,我觉得必须有更好的方法来做到这一点。
有没有其他(更短的)解决方案?