【发布时间】:2015-12-10 13:26:01
【问题描述】:
我想写一个类型特征来检查某个类型是否有成员member。如果member 是public,那么有很多方法可以做到这一点(例如void_t),其中最简洁的可能是Yakk's can_apply(最终可以称为std::is_detected) :
struct C {
int member;
};
template <typename T>
using member_type = decltype(&T::member);
template <typename T>
using has_member = can_apply<member_type, T>;
static_assert(has_member<C>{}, "!"); // OK
但如果成员是private,则此特征将失败,因为member 上的访问是非良构的(我们不是朋友),并且由于访问而导致的非良构之间没有区别由于这个东西不存在的原因和不正确的原因:
class D {
int member;
};
static_assert(has_member<D>{}, "!"); // error
有没有办法在所有访问控制中编写这样的成员检查器?
【问题讨论】:
-
不要说这是一个坏主意。我没有资格这样做。但是我真的很好奇,这有什么用?即,查询
private类型的特征(无论如何您都无法访问)的用例是什么? -
如果
member是私有的,您应该能够安全地重命名该成员,而不会破坏恰好使用您的类的外部代码。能够以您使用的方式创建has_member模板将使创建代码变得非常容易,至少不会像其他开发人员可能合理期望的代码那样运行。所以我分享 DevSolar 的问题:你有什么用? -
@DevSolar 我真的很想知道这样的事情是否可行。名称查找本身不考虑访问权限,因此似乎应该可以包装类型特征。
标签: c++ templates c++11 c++14 typetraits