모두의 코드 커뮤니티

템플릿 객체가 가지는 템플릿 인자의 개수를 아는 방법이 있을까요?

임의의 템플릿 객체를 받는 템플릿 함수NofTemParam 가 있다고 합시다.

template< template<typename…> class TOBJ >
int constexpr NofTemParam();

이 함수가 템플릿 객체 TOBJ를 받았을 때, 그 TOBJ가 취하는 템플릿 인자의 개수를 반환하게 하고 싶다면 어떻게 하면 될까요?

가령

template<typename T1, typename T2 = T1, typename T3 = T1>
class tobj;

이면

// nof_tparam이 3이 되도록 하고 싶음.
auto constexpr nof_tparam = NofTemParam< tobj >();

처럼 사용하려면 어떻게 해야할까요?

추가적인 질문으로, 위 tobj 는 템플릿 파라미터를 최대 3개까지 받을 수 있지만 필수적으로 받아야만 하는 템플릿 인자는 T1 하나입니다. 이 정보도 역시 알 수 있는 방법이 있을까요? 예를 들자면.

template< template<typename…> class TOBJ >
int constexpr NofLeastTemParam();

라는 템플릿 함수로

// nof_least_tparam 이 1이 되도록 하고 싶음
auto constexpr nof_least_tparam = NofLeastTemParam< tobj >();

를 유도하고 싶다면 템플릿 함수 NofLeastTemParam을 어떻게 만들어야 할까요?

1 Like

재밌는 문제네요. 템플릿 함수로 만들기에는 조금 복잡한 것 같습니다. 만약에 목표가 너무나 많은 개수의 템플릿 인자를 받는 클래스의 생성을 방지하는 것이라면 아래와 같이 클래스 자체 내부에 코드를 추가해서 해당 클래스에 전달된 템플릿 인자의 개수를 쉽게 확인할 수 있습니다.

#include <iostream>
#include <tuple>

template <typename... Args>
struct WTF {
  static constexpr int num_param = std::tuple_size<std::tuple<Args...>>::value;
  WTF() { static_assert(num_param <= 3); }
};

int main() {
  WTF<int, char, float> wtf;
  std::cout << wtf.num_param;

  WTF<int, int, char, char> wtf2; // 오류
}

사실 템플릿 함수도 뭔가 tuple_size 를 잘 가져다 쓰면 될거 같은데 하필이면 nested template parameter 라서 뭔가 접근이 잘 안되네요.