131
|
1 // { dg-additional-options "-std=c++14 -Wno-return-type" }
|
|
2
|
|
3 template<typename Signature>
|
|
4 class function;
|
|
5
|
|
6 template<typename R, typename... Args>
|
|
7 class invoker_base
|
|
8 {
|
|
9 public:
|
|
10 virtual ~invoker_base() { }
|
|
11 };
|
|
12
|
|
13 template<typename F, typename R, typename... Args>
|
|
14 class functor_invoker : public invoker_base<R, Args...>
|
|
15 {
|
|
16 public:
|
|
17 explicit functor_invoker(const F& f) : f(f) { }
|
|
18 private:
|
|
19 F f;
|
|
20 };
|
|
21
|
|
22 template<typename R, typename... Args>
|
|
23 class function<R (Args...)> {
|
|
24 public:
|
|
25 template<typename F>
|
|
26 function(const F& f) : invoker(0) {
|
|
27 invoker = new functor_invoker<F, R, Args...>(f);
|
|
28 }
|
|
29 ~function() {
|
|
30 if (invoker)
|
|
31 delete invoker;
|
|
32 }
|
|
33 private:
|
|
34 invoker_base<R, Args...>* invoker;
|
|
35 };
|
|
36
|
|
37 template<typename>
|
|
38 struct unique_ptr { };
|
|
39
|
|
40 struct A {};
|
|
41 template <class...> struct typelist {};
|
|
42 template <class... Cs> unique_ptr<A> chooseB(typelist<Cs...>);
|
|
43 template <class... Cs, class Idx, class... Rest>
|
|
44 unique_ptr<A> chooseB(typelist<Cs...> choices, Idx, Rest... rest) {
|
|
45 auto f = [=](auto) { return [=] { return chooseB(choices, rest...); }; };
|
|
46 function<unique_ptr<A>()> fs[]{f(Cs{})...};
|
|
47 }
|
|
48 main() { chooseB(typelist<double, char>{}, 0, 1, 2); }
|