ページ 1 / 1
可変長引数についての質問です
Posted: 2018年3月19日(月) 22:17
by keito
いつもお世話になっています!C++は初心者です。
可変長引数についての質問なんですが、以下のような関数を作りたいです。
コード:
int foo(const char* String, ...){
//...
// fooの0番目の引数、1番目の引数、2番目の引数...を実引数とするprintf
printf( )
}
こんな感じの関数fooを作りたいのですがどのようにprintfの括弧の中身を書けばいいのか分からずにいます…。
分かる方がいたら教えてください。
Re: 可変長引数についての質問です
Posted: 2018年3月19日(月) 22:53
by keito
すみません!自己解決しました!
コード:
#include <cstdio>
template <typename ... Args>
int foo(const char *format, Args const & ... args) {
return printf(format, args ...);
}
int main() {
foo("%d + %d = %d\n", 3, 4, 3+4);
}
Re: 可変長引数についての質問です
Posted: 2018年4月20日(金) 22:54
by 参照魚
templateを用いずに関数で完結させるとしたらこんな感じでした。
コード:
int foo( const char* format, ... ){
va_list list;
va_start( list, format );
const auto num = std::vsnprintf( nullptr, 0, format, list );
const auto buf = new char[num];
::vsprintf( buf, format, list );
const auto val = printf( "%s", buf );
delete [] buf;
va_end( list );
return val;
}
Re: 可変長引数についての質問です
Posted: 2018年4月21日(土) 15:34
by かずま
printf の代わりに vprintf を使いましょう。
コード:
#include <cstdio>
#include <cstdarg>
int foo(const char *format, ...) {
va_list ap;
va_start(ap, format);
int rv = vprintf(format, ap);
va_end(ap);
return rv;
}
int main() {
foo("%d + %d = %d\n", 3, 4, 3+4);
}