1#include <vector>
2#include <type_traits>
3using namespace std;
4
5class AA {};
6class BB {};
7
8
9class Test {
10public:
11 template <class T, template <class> class Container, std::enable_if_t<std::is_same_v<T, int>> * = nullptr>
12 void f1(Container<T> &ret);
13
14 template<template<class> class Container>
15 void f2(Container<AA> *);
16
17 template<template<class> class Container>
18 void f3(Container<BB> *);
19};
20
21
22template <class T, template <class> class Container, std::enable_if_t<std::is_same_v<T, int>> * = nullptr>
23void Test::f1(Container<T> &ret)
24{
25 cout << __func__ << std::endl;
26 ret.push_back(1);
27// if constexpr (std::is_same_v<int, T>) {
28// std::cout << "inst" << std::endl;
29// }
30}
31
32template <template<class> class Container>
33void Test::f2(Container<AA> *c)
34{
35 std::cout << __func__ << std::endl;
36}
37
38template <template<class> class Container>
39void Test::f3(Container<BB> *c)
40{
41 std::cout << __func__ << std::endl;
42}
43
44struct X {enum { value1 = false, value2 = true };};
45template<class T, std::enable_if_t<T::value2, int> = 0>
46void func() {
47 std::cout << __func__ << std::endl;
48}
49
50
51int main()
52{
53 vector<int> vec(10);
54
55 Test *test = new Test;
56 test->template f1<int, std::vector>(vec);
57 test->template f2<std::vector>(nullptr);
58 test->template f3<std::vector>(nullptr);
59
60 func<X>();
61 return 0;
62}