fork download
  1. #include <iostream>
  2.  
  3. // test stubs:
  4. template<typename... Ts>
  5. using UPtr = int;
  6. template<typename... Ts>
  7. using SPtr = double;
  8.  
  9. template<typename T, typename...TA>
  10. UPtr<T,TA...> makeUniquePtr() {
  11. std::cout << "makeUniquePtr\n";
  12. return {};
  13. }
  14. template<typename T, typename...TA>
  15. SPtr<T,TA...> makeSharedPtr() {
  16. std::cout << "makeSharedPtr\n";
  17. return {};
  18. }
  19.  
  20. struct unique_ptr_maker {
  21. template<typename T, typename...TA, typename...Args>
  22. static UPtr<T, TA...> make(Args&&...args) {
  23. return makeUniquePtr<T, TA...>( std::forward<Args>(args)... );
  24. }
  25. };
  26. struct shared_ptr_maker {
  27. template<typename T, typename...TA, typename...Args>
  28. static SPtr<T, TA...> make(Args&&...args) {
  29. return makeSharedPtr<T, TA...>( std::forward<Args>(args)... );
  30. }
  31. };
  32.  
  33. template<typename maker, class T, class... TA> void func() {
  34. std::cout << "func\n";
  35. maker::template make<T, TA...>();
  36. }
  37.  
  38. template<class T, class... TA> void implementation1()
  39. {
  40. func<unique_ptr_maker, T, TA...>();
  41. }
  42. template<class T, class... TA> void implementation2()
  43. {
  44. func<shared_ptr_maker, T, TA...>();
  45. }
  46. int main() {
  47. implementation1<int, double>();
  48. implementation2<int, char>();
  49. return 0;
  50. }
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
func
makeUniquePtr
func
makeSharedPtr