blob: 78ec8cbd0b88a5447783f61e7813bd1719696770 [file] [log] [blame]
// { dg-do compile { target c++11 } }
template<typename _Tp>
_Tp&& declval() noexcept;
template<bool b>
struct bt {
static constexpr bool value = b;
};
template <typename To_, typename... From_>
class my_is_convertible_many {
private:
template <typename To>
struct indirector {
indirector(To);
};
template <typename To, typename... From>
struct tag {};
template <typename To, typename... From>
static auto test(tag<To, From...>)
-> decltype(indirector<To>({declval<From>()...}), bt<true>());
static auto test(...)
-> bt<false>;
public:
static constexpr bool value = decltype(test(tag<To_, From_...>()))::value;
};
struct A {};
struct B {};
struct C {};
struct Test {
Test(A, A);
//Test(B, B);
explicit Test(C, C);
};
int main() {
static_assert(my_is_convertible_many<Test, A, A>::value,""); // true, correct
static_assert(!my_is_convertible_many<Test, B, B>::value,""); // false, correct
static_assert(!my_is_convertible_many<Test, C, C>::value,""); // error
return 0;
}