【发布时间】:2018-01-25 10:48:48
【问题描述】:
是否可以检查给定类中是否声明了成员变量、成员函数或类型定义?
StackOverflow 上的各种问题都谈到了检查给定类是否仅包含一个成员,主要是使用 std::is_detected。但是所有这些解决方案也在派生类中检测到成员,派生类可能不会自己声明成员。
例如,以下内容无法编译。
#include <experimental/type_traits>
struct base
{
using type = std::true_type;
};
struct derived : public base { };
template<typename T>
using has_type_t = typename T::type;
template<typename T>
constexpr inline bool has_type_v =
std::experimental::is_detected<has_type_t, T>::value;
int main ()
{
static_assert (has_type_v<base>);
static_assert (!has_type_v<derived>);
}
可以进行任何更改以使这两个断言成立吗?还是需要反思?
【问题讨论】:
-
struct derived : public base { using base::type; };的预期结果是什么? -
你的用途是什么?您可以检查成员 Btw,但类型...
-
@VTT 对于这种情况,我希望得到“真”。所以我希望它在示例中表现为“基础”,因为它声明了自己的成员。但我想,在这方面不同的解决方案也会很有趣/正确。
-
@Jarod42 我想将某些类标记为允许用作另一个模板的模板参数。我目前正在为此使用类型特征,但是用户必须编写一些样板文件才能选择加入。如果他们能说“使用 is_allowed_for_use = std::true_type;”会更好或类似于选择加入。因此,检查静态成员对我来说同样有用。
-
我认为您所描述的内容需要某种形式的反射,除非我们能找到一些惯用的方法在每个派生类中正确隐藏
type(但即使那样它也不会成为“即插即用”的解决方案)
标签: c++ sfinae typetraits c++17