1 // { dg-do compile { target c++11 } }
2 template<typename _Tp>
3 _Tp&& declval() noexcept;
4
5 template<bool b>
6 struct bt {
7 static constexpr bool value = b;
8 };
9
10 template <typename To_, typename... From_>
11 class my_is_convertible_many {
12 private:
13 template <typename To>
14 struct indirector {
15 indirector(To);
16 };
17
18 template <typename To, typename... From>
19 struct tag {};
20
21 template <typename To, typename... From>
22 static auto test(tag<To, From...>)
23 -> decltype(indirector<To>({declval<From>()...}), bt<true>());
24 static auto test(...)
25 -> bt<false>;
26
27 public:
28 static constexpr bool value = decltype(test(tag<To_, From_...>()))::value;
29 };
30
31 struct A {};
32 struct B {};
33 struct C {};
34
35 struct Test {
36 Test(A, A);
37 //Test(B, B);
38 explicit Test(C, C);
39 };
40
main()41 int main() {
42 static_assert(my_is_convertible_many<Test, A, A>::value,""); // true, correct
43 static_assert(!my_is_convertible_many<Test, B, B>::value,""); // false, correct
44 static_assert(!my_is_convertible_many<Test, C, C>::value,""); // error
45 return 0;
46 }
47