libC++에서 GCC의 구현되지 않은 항상 인라이닝 가변 인자 함수를 무시하기 위해 가변 인자 함수 (snprintf와 같은, 더 정확하게, * _l 변수)를 변수로 감쌀 수 있다고 생각했습니다. 유사한 효과를 얻을 수있는 템플릿. 인스턴스화는 variadic 함수의 varargs를 채울 것이므로 함수가 멋지게 인라인 될 수 있습니다. 문제는 variadic 템플릿을 작성하는 것에 대해 제일 먼저 알지 못하기 때문에 템플릿 인수를 별도의 인수로 변환하는 방법을 확실히 알지 못합니다.가변 인자 템플릿을 가변 인자 함수로 묶기
int __sprintf_l(char *__s, locale_t __l, const char *__format, ...) {
va_list __va;
va_start(__va, __format);
int __res = vsprintf_l(__s, __l, __format, __va);
va_end(__va);
return __res;
}
내가 대체하고 싶습니다
양식의 뭔가입니다 :
template<typename... Args>
int __sprintf_l(char *__s, locale_t __l, const char *__format, Args... args) {
int __res = vsprintf_l(__s, __l, __format, args...);
return __res;
}
이 작동하지 않는 때문에
내가 대체 할 찾고 있어요 코드의 형식은 확장 된 args...
으로 type
에서 va_list {aka char*}
으로 변환 할 수 없습니다. 방법이 없다면 하워드를 신뢰하고 필요한 코드의 양을 실질적으로 두 배로 늘릴 수있는 하나, 두 개의 인수 인 항상 인라인 템플릿을 구현해야 할 것입니다.
편집 : 아마도 std::tuple
을 args
으로 변환하는 방법은 va_list에 포함됩니까?
'va_list' 구현의 구현이 정의되어 있지 않습니까? 그래서 변환 할 수있는 이식성있는 방법이 없습니다. 맞습니까? 또한'boost :: format'이 대안이 될 수 있습니다. – pmr
분명히하자면,'args'는 전혀 std :: tuple이 아닙니다. 그것은 고유 한 실체이며, 나는 손을 잊지 않는 이름을 가지고 있습니다. 'args ...'는 본질적으로'arg0, arg1, arg2, ..., argN'으로 확장됩니다; 즉,'vsprintf_l '이 하나의'va_list' 객체가 아니라 가변 인자를 받아 들인다면, 당신이했던 것은 작동 할 것입니다. –