An has_member_type macro.
authorYedidya Feldblum <yfeldblum@fb.com>
Sat, 11 Jul 2015 04:24:17 +0000 (21:24 -0700)
committerSara Golemon <sgolemon@fb.com>
Mon, 13 Jul 2015 18:16:58 +0000 (11:16 -0700)
Summary: [Folly] An has_member_type macro.

Reviewed By: @juchem

Differential Revision: D2229775

folly/Traits.h
folly/test/TraitsTest.cpp

index 309157c4dfadcf952faddc8284bf004f07a401ac..fd2be06beefb7a2649fa43ed432597105569e6ba 100644 (file)
@@ -432,6 +432,16 @@ FOLLY_ASSUME_FBVECTOR_COMPATIBLE_1(std::function);
 // Boost
 FOLLY_ASSUME_FBVECTOR_COMPATIBLE_1(boost::shared_ptr);
 
+#define FOLLY_CREATE_HAS_MEMBER_TYPE_TRAITS(classname, type_name) \
+  template <typename T> \
+  struct classname { \
+    template <typename C> \
+    constexpr static bool test(typename C::type_name*) { return true; } \
+    template <typename> \
+    constexpr static bool test(...) { return false; } \
+    constexpr static bool value = test<T>(nullptr); \
+  }
+
 #define FOLLY_CREATE_HAS_MEMBER_FN_TRAITS_IMPL(classname, func_name, cv_qual) \
   template <typename TTheClass_, typename RTheReturn_, typename... TTheArgs_> \
   class classname<TTheClass_, RTheReturn_(TTheArgs_...) cv_qual> { \
index 83ffb43dfea9887fb23cb3362a5d24116b80162b..e3776e2bdc8a58c66bd49e8917813337891f12f8 100644 (file)
@@ -110,6 +110,15 @@ TEST(Traits, relational) {
   EXPECT_FALSE((folly::greater_than<uint8_t, 255u, uint8_t>(254u)));
 }
 
+struct membership_no {};
+struct membership_yes { using x = void; };
+FOLLY_CREATE_HAS_MEMBER_TYPE_TRAITS(has_member_type_x, x);
+
+TEST(Traits, has_member_type) {
+  EXPECT_FALSE(bool(has_member_type_x<membership_no>::value));
+  EXPECT_TRUE(bool(has_member_type_x<membership_yes>::value));
+}
+
 int main(int argc, char ** argv) {
   testing::InitGoogleTest(&argc, argv);
   gflags::ParseCommandLineFlags(&argc, &argv, true);