Advertisement
Rapptz

Untitled

Sep 1st, 2014
568
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.01 KB | None | 0 0
  1. struct drawable {};
  2.  
  3. struct texture {};
  4.  
  5. template<typename...>
  6. struct void_ { using type = void; };
  7.  
  8. template<typename T, typename = void>
  9. struct has_callback : std::false_type {};
  10. template<typename T>
  11. struct has_callback<T, typename void_<decltype(std::declval<T>().callback())>::type> : std::true_type {};
  12.  
  13. struct test {
  14.     template<typename Drawable, typename std::enable_if<has_callback<Drawable>::value, int>::type = 0>
  15.     void do_register(const Drawable& t) {
  16.         // register stuff's texture
  17.         // ...
  18.         // after registering, do a callback since it exists
  19.         t.callback();
  20.     }
  21.  
  22.     template<typename Drawable, typename std::enable_if<!has_callback<Drawable>::value, int>::type = 0>
  23.     void do_register(const Drawable& t) {
  24.         // register the stuff's texture
  25.         // ...
  26.         // after registering, the callback doesn't
  27.         // exist so don't use it
  28.     }
  29.    
  30.     void do_register(const texture& t) {
  31.         // register texture
  32.         // no callback
  33.     }
  34. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement