/* Copyright Barrett Adair 2016 Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE.md or copy at http ://boost.org/LICENSE_1_0.txt) */ #include #include #include "test.hpp" struct foo; template struct is_substitution_failure_insert_args { template static auto test(...) -> std::true_type; template* = nullptr> static auto test(int) -> std::false_type; static constexpr bool value = decltype(test(0))::value; }; template void assert_sfinae_insert_args() { CT_ASSERT(is_substitution_failure_insert_args::value); } int main() { auto lambda = [](){}; //SFINAE because parameter list not present/cannot be manipulated assert_sfinae_insert_args<0, decltype(lambda)>(); assert_sfinae_insert_args<0, decltype(lambda)&>(); assert_sfinae_insert_args<0, int>(); assert_sfinae_insert_args<0, int &>(); assert_sfinae_insert_args<0, int (* const &)()>(); assert_sfinae_insert_args<0, int (foo::* &)()>(); assert_sfinae_insert_args<0, int (foo::* const)()>(); assert_sfinae_insert_args<0, int (foo::* const &)()>(); assert_sfinae_insert_args<0, int (foo::* volatile)()>(); assert_sfinae_insert_args<0, void>(); assert_sfinae_insert_args<0, void*>(); assert_sfinae_insert_args<0, void(**)()>(); //SFINAE because index is out of range assert_sfinae_insert_args<17, void()>(); assert_sfinae_insert_args<1, void()>(); assert_sfinae_insert_args<2, void(int)>(); }