自动模板参数、数据成员和恒常性
auto template parameter, data member and constness
>假设我有一个指向数据成员的指针,我想知道它是否是常量。换句话说:
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)>>;
但是,这对我来说看起来很丑,我觉得一定有更好的方法可以做到这一点。
还有其他(更短的(解决方案吗?
您可以更改is_const_data_member
以对单个类型模板参数进行操作:
template<typename MemPtr>
struct is_const_data_member: std::false_type {};
template<typename Class, typename Type>
struct is_const_data_member<const Type Class::*>: std::true_type {};
然后,从template<typename Class, typename Type, Type Class:: *Member> void foo()
使用它作为
is_const_data_member<Type Class::*>::value
(在我看来,这稍微直观一些。
从template<auto Member> void foo()
您将其用作
is_const_data_member<decltype(Member)>::value
您还可以重写特征以对auto
模板参数进行操作。但是通过使用类型参数,您可以避免对相同类型的不同指针进行不必要的实例化,这应该是一件好事。
像这样的事情怎么样:
template <typename T>
struct is_const_data_member : std::false_type {};
template <typename C, typename T>
struct is_const_data_member<const T C::*> : std::true_type {};
template <auto T>
constexpr bool is_const_data_member_v = is_const_data_member<decltype(T)>::value;
然后,例如
struct Test
{
int a;
const int b;
};
bool x = is_const_data_member_v<&Test::a>;
bool y = is_const_data_member_v<&Test::b>;
工作测试在这里
相关文章:
- 用于访问容器<T>数据成员的正确 API
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 数据成员SFINAE的C++17测试:gcc vs clang
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 如何在c++中定义以struct为数据成员的类中的构造函数
- 静态数据成员模板专用化的实例化点在哪里
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 自动模板参数、数据成员和恒常性
- 引用类型的数据成员提供有关恒常正确性"loophole"
- 将指向数据成员的指针传递给 std::invoke 时有哪些用例和有用性?
- 关于Lambdas,转换以功能指针以及私人数据成员的可见性
- 易失性数据成员是易于复制的
- C++类的静态数据成员上的多态性
- C++ - 为什么常量函数不强制成员指针上的恒常性?
- 在声明数据成员之前,成员函数中数据成员的可访问性
- 数据成员的编译时多态性
- 具有新数据成员的多态性
- 获取用于非侵入性提升序列化C++的私有数据成员
- 多态性和数据成员
- 从"this"中抛弃恒常性,然后更改成员值是否会调用未定义的行为?