(200802) 코드포스

문제는 안풀고 ㅎㅎ

토요일 저녁부터 주말동안 이것만 끄적거렸네요.
solve function의 parameter을 적어서 작성하면 cin으로 받도록 하면 좋을 것 같다란 생각이 들어서요.
아이디어가 떠오른다음 머리속에서 계속 맴돌아서 문제가 손에 안잡히더라구요.
일단 돌아가도록 완성했습니다.

중간중간에 몇 번이고 때려쳤다가 다시 붙잡았다가 반복했어요.
variadic template, parameter pack 이녀석들… 사실 아직도 완전히 이해는 못한거 같네요.

namespace {
using namespace std;

constexpr bool kMultiTestCase = true;
using Solver = predefined::Solver<kMultiTestCase>;

}  // unnamed namespace;

void solve0() {
  LOG_INFO << "solve0";
}

void solve1(int i) {
  LOG_INFO << "solve1";
  LOG_INFO << i;
}

void solve2(int i, char a) {
  LOG_INFO << "solve2";
  LOG_INFO << i;
  LOG_INFO << a;
}

void solve3(int i, char a, double d) {
  LOG_INFO << "solve3";
  LOG_INFO << i;
  LOG_INFO << a;
  LOG_INFO << d;
}

template <class Arg>
void GetArg(Arg& value) {
  std::cin >> value;
}

template <size_t index, class... Args>
typename std::enable_if<index == sizeof...(Args)>::type
GetArgsImpl(std::tuple<Args...>& args) {}

template <size_t index, class... Args>
typename std::enable_if<(index < sizeof...(Args))>::type
GetArgsImpl(std::tuple<Args...>& args) {
  GetArg(std::get<index>(args));
  GetArgsImpl<index + 1>(args);
}

template<typename ... Args>
std::tuple<Args...> GetArgs() {
  std::tuple<Args...> args;

  GetArgsImpl<0>(args);

  return args;
}

template<int...> struct IndexTuple {};

template<int I, typename T, typename... Types> 
struct MakeIndexesImpl; 

template<int I, int... Indexes, typename T, typename ... Types> 
struct MakeIndexesImpl<I, IndexTuple<Indexes...>, T, Types...> 
{ 
    typedef typename MakeIndexesImpl<I + 1, IndexTuple<Indexes..., I>, Types...>::type type; 
};

template<int I, int... Indexes> 
struct MakeIndexesImpl<I, IndexTuple<Indexes...> > 
{ 
    typedef IndexTuple<Indexes...> type; 
};

template<typename ... Types> 
struct MakeIndexes : MakeIndexesImpl<0, IndexTuple<>, Types...> 
{};

template<class... Args, int... Indexes > 
void RunImpl(void (*func)(Args...), std::tuple<Args...>&& args, IndexTuple< Indexes... >) 
{ 
    func(std::forward<Args>( std::get<Indexes>(args))... ); 
} 

template<class ... Args> 
void RunImpl(void (*func)(Args...), const std::tuple<Args...>& args) {
    RunImpl(func, std::tuple<Args...>(args), typename MakeIndexes<Args...>::type());
}

template< typename ... Args>
void Run(void (*func)(Args...)) {
  std::tuple<Args...> args = GetArgs<Args...>();

  RunImpl(func, args);
} 


int main(int argc, char** argv) {
  INIT_CODEFORCES();

  Run(&solve0);
  Run(&solve1);
  Run(&solve2);
  Run(&solve3);

  //Solver([](){solve();});

  return 0;
}

INPUT

1
1 a
1 a 3.1415

OUTPUT

solve0
solve1
1
solve2
1
a
solve3
1
a
3.1415

1 Like