fork download
  1. #include <iostream>
  2.  
  3. template<typename... T> using void_t = void;
  4.  
  5. template<typename T> struct TemporaryBindObject {};
  6.  
  7. namespace detail
  8. {
  9. template<typename... T> using void_t = void;
  10.  
  11. template<typename... T> struct TemporaryBindObject {};
  12.  
  13. template<template<typename...> class Dest, typename T, typename = void_t<>> struct toTypesOf
  14. : std::false_type {};
  15. template<template<typename...> class Dest, template<typename...> class Src, typename... Ts> struct toTypesOf<Dest, Src<Ts...>, void_t<Dest<Ts...>>>
  16. : std::true_type {};
  17. }
  18.  
  19. template<template<typename...> class Dest, typename... Ts>
  20. using IsValidBind = typename detail::toTypesOf<Dest, detail::TemporaryBindObject<Ts...>>;
  21.  
  22. template<template<typename...> class Dest, typename... Ts>
  23. using IsValidBindWithFloat = IsValidBind<Dest, Ts..., float>;
  24.  
  25. template<template<typename...> class Dest, typename... Ts>
  26. using IsValidBindWithVoid = IsValidBind<Dest, Ts..., void>;
  27.  
  28. template<typename T> struct OneParamStruct{};
  29. template<typename T1, typename T2> struct TwoParamStruct{};
  30.  
  31. int main()
  32. {
  33. std::cout << "Can bind to TwoParamStruct: " << IsValidBindWithFloat<TwoParamStruct, int>::value << std::endl;
  34. std::cout << "Can bind to OneParamStruct: " << IsValidBindWithFloat<OneParamStruct, int>::value << std::endl;
  35. }
Success #stdin #stdout 0s 3456KB
stdin
Standard input is empty
stdout
Can bind to TwoParamStruct: 1
Can bind to OneParamStruct: 0