N을 기반으로 자동 생성이 가능하다면, 일반적으로 필요한 것을 수행 할 수있는 코드를 작성할 수 있다고 생각합니다. (variadics를 사용하려고 시도한 의견은이를 강화합니다).
귀하의 기능이 또한 T
에 템플릿 화되어 있다는 사실은 안타깝게도 제가 바라는 것보다 조금 더 복잡합니다. 필자가 제공하는 것보다 간단한 솔루션이 있지만 필자가 보았던 유일한 유형은 유형을 명시 적으로 지정하거나 컴파일 타임에 수행 할 수있는 런타임 검사를 미루는 것입니다. 그대로, 내가 원하는대로 할 수있는 유일한 방법은 가변성 템플릿을 사용하는 것입니다. 이것은 당신이 원하는의 대부분을 가져옵니다
template <std::size_t N>
class System {
template <class ... Ts>
void fun(Ts& ts) {
static_assert(sizeof...(Ts) == N, "Wrong number of parameters!");
}
};
나는 그것이 차이를 만들 것입니다 가능성은 거의이기 때문에 당신이라는 이름의 또 다른 멤버 함수를 가질 계획이 아니라면 그것을 경우, 수 일을 간단하게 유지하기 위해 (그리고보다는 정적 주장했습니다 fun
... 그렇게하지 마세요). 이제이 함수는 N 개의 인수로 호출되는 것을 허용하지만 모든 유형이 다를 수 있습니다. 당신은 그들 모두가 같기를 원합니다. 그래서 우리는 약간의 TMP가 필요합니다.
template <class ... Ts>
struct all_same{};
template <class T>
struct all_same<T> : std::true_type {
using same_type = T;
};
template <class T, class ... Ts>
struct all_same<T, T, Ts...> : all_same<T, Ts...> {};
template <class T1, class T2, class ... Ts>
struct all_same<T1, T2, Ts...> : std::false_type {};
일부 재귀 적 TMP는 우리가 원하는 것을 얻을 수 있습니다. 둘 다 팩의 모든 유형이 같은지 여부에 대한 진정한 거짓 표시 자이며 동일한 경우 공통 유형에 액세스 할 수 있습니다. 우리는 일반적인 유형이 있고, 크기를 확인했으면, 우리는 그 위에 배열과 루프를 초기화 팩을 사용할 수 있습니다, 그래서 우리는 우리의 함수 내에서 짜증나는 가변 스타일의 프로그래밍 일을 계속 할 필요가 없습니다 :
template <std::size_t N>
struct System {
template <class ... Ts>
void fun(Ts&... ts) {
static_assert(sizeof...(Ts) == N, "Wrong number of parameters!");
using same = all_same<Ts...>;
static_assert(same::value, "All types must be the same!");
std::array<std::reference_wrapper<typename same::same_type>, N> x{ts...};
for (auto& e : x) { std::cerr << e << std::endl; }
}
};
정확한 요구에 맞게이 솔루션을 수정하면 C++에 대한 전문성이 약간 필요할 것이며, 또한 까다로운 특정 상황, 예를 들어 문자열 리터럴과 std::string
또는 암시 적으로 변환 가능한 데 사용 된 다른 유형을 모두 전달하면 오류가 발생합니다. 그래도 도움이되면 도움이되기를 바랍니다. 실제 예 : http://coliru.stacked-crooked.com/a/08ac23da33deb8ef.
저는 100 % 확신하지 못하고 있지만이 방법은 잘못된 것 같습니다. 코드를 자동 생성하는 데 뭔가 다른 방법을 사용하는 것이 더 나을 것입니다 (예 : 작은 스크립트) – UnholySheep