#include <iomanip>
#include <iostream>
#include <type_traits>

using namespace std;

template <typename T>
using function_ptr = typename std::add_pointer<typename std::enable_if<std::is_function<T>::value,T>::type>::type;


namespace detail{

template<typename T, std::size_t S>
struct array_helper{
	typedef T type[S];
};

template<typename T>
struct array_helper<T,0>{
	typedef T type[];
};

}

template <typename T, std::size_t S = 0>
using c_array = typename detail::array_helper<T,S>::type;


int main(int /*argc*/, c_array<char*> /*argv*/)
{
	typedef char*(*(*t1)(int (*)(char* , char* )))[];
	typedef function_ptr<c_array<char*>*(function_ptr<int(char*,char*)>)> t2;

	cout << boolalpha << is_same<t1,t2>::value << endl;
	return 0;
}
