問題タブ [variadic]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
5 に答える
62235 参照

r - 独自の関数を作成するときに R の省略記号機能を使用するには?

R 言語には、可変数の引数を取ることができる関数を定義するための便利な機能があります。たとえば、関数data.frameは任意の数の引数を取り、各引数は結果のデータ テーブルの列のデータになります。使用例:

関数のシグネチャには、次のように省略記号が含まれます。

複数の値を取り、それらを単一の戻り値に統合する(および他の処理を行う)、同様のことを行う関数を作成したいと思います。これを行うには...、関数内で関数の引数から を「アンパック」する方法を理解する必要があります。これを行う方法がわかりません。の関数定義の関連する行data.frameobject <- as.list(substitute(list(...)))[-1L]、私には意味がわかりません。

では、関数のシグネチャの省略記号をたとえばリストに変換するにはどうすればよいでしょうか?

より具体的にget_list_from_ellipsisは、以下のコードにどのように記述すればよいでしょうか?


編集

これを行うには2つの方法があるようです。as.list(substitute(list(...)))[-1L]とですlist(...)。ただし、これら 2 つはまったく同じことを行うわけではありません。(違いについては、回答の例を参照してください。)それらの実際の違いは何か、どちらを使用すべきか教えてもらえますか?

0 投票する
1 に答える
504 参照

c++ - 可変個引数テンプレート関数に引数を渡すC++0x

参照によって可変数の引数を取るとはどういう意味ですか?それぞれの引数が参照によって渡されるということですか?

たとえば、各引数に対していくつかの処理を実行する次の関数について考えてみます。

今私が持っている場合:

これにより、f(int&、int&、int&)、f(int&、int&)、そして最後にf(int&)がインスタンス化されますか?

f()の2番目のパラメーターを「Tail&...」ではなく「Tail...」に変更した場合はどうでしょうか。インスタンス化はf(int&、int、int)、f(int&、int)、最後にf(int&)になります。つまり、たとえば「c」は最初の2つの呼び出しでコピーされ、最後の呼び出しで変更されます。オリジナルの代わりにコピーしますか?

誰かが可変個引数テンプレートがどのように機能するかを説明する良いリファレンスを指摘できますか?

0 投票する
3 に答える
2705 参照

c - `-pedantic`によって生成されるこのコンパイラ警告はどういう意味ですか?

このGCC警告はどういう意味ですか?

関連する行は次のとおりです。

最後の行は、関数実装内の行232です。コンパイラフラグは次のとおりです。

0 投票する
2 に答える
2233 参照

c++ - 可変個引数テンプレートを使用して C++ で mixin コンストラクターの問題を解決する

私は最近、コンストラクターの問題に取り組みました。この問題では、互いに装飾するさまざまな mixin クラス (および最上位のホスト クラス) が異なるコンストラクター シグネチャを持っています。結果の装飾されたクラスで単一のコンストラクターを維持し、init 関数を追加せずに、次の解決策を見つけました。mixin クラスに課される唯一の制限は、そのコンストラクターが複数のパラメーターを受け取る場合、それらはすべて単一のタプルにカプセル化する必要があるということです。(このコードを g++ でコンパイルするには、-std=c++0x フラグが必要です)

私の質問は次のとおりです
。1) C++0X でこの問題を解決するためのより優れた、より洗練された方法はありますか?
2) 具体的には、タプルは本当に必要ですか?

0 投票する
5 に答える
1331 参照

c - stdargs(va_start)を使用したCプログラムの奇妙な動作(SEGFAULT)

バッファに必要なメモリを割り当てることを使命とする可変個引数C関数を作成し、そのバッファでこの関数に与えられた引数をsprintfします。しかし、私はそれで奇妙な振る舞いを見ています。一度だけ動作します。この関数を2回呼び出すと、segfaultsになります。

このプログラムの出力は次のとおりです。

私は何か間違ったことをしていますか?va_start1つの関数で複数回使用するべきではありませんか?代替案はありますか?どうもありがとう!:)

0 投票する
1 に答える
586 参照

c++ - c++0x タプルは、新しい可変個引数テンプレートまたは Boost のマクロ化されたタプル実装を使用しますか?

Boost のバージョンに基づいていると読みましたが、実装に至ったとき、それが何を意味するのかよくわかりませんでした。Boost が独自の可変個引数テンプレートを使用することは知っていますが、c++0x は新しいタプルに独自の可変個引数テンプレートを使用すると思います。

0 投票する
1 に答える
417 参照

c++ - 可変個引数クラス階層における引数のない関数呼び出しの曖昧さの解消

変数階層 (以下の ObjGetter) から派生するクラス (以下の MyGizmo) のユーザーに、引数を取らないメンバー関数 (以下の check()) を明確に呼び出す単純で整然とした方法を提供しようとしています。引数を取る関数 (以下の tune() など) でこれを機能させることができますが、引数を取らない関数で機能させる方法が見つかりませんでした。

私は次のことを試しましたが、完全には満足していません:

まず、階層内で使用される単純にテンプレート化された 2 番目のクラスを使用して、醜い呼び出しを減らしてテンプレート引数を 1 つだけ持つことができます。次のような結果が得られます。

Type2Type ヘルパーを使用して check() に引数を与えることができます。これは問題なく動作します。次のようになります。

マクロを使用できますが、そこに行きたくありません...

テンプレートエイリアスが解決策を提供すると思いますが、まだサポートしていない g++ を使用しています。その間、他に何かありますか?どうもありがとう!

0 投票する
2 に答える
140 参照

c++ - 3 項の Variadic マクロ

dll を明示的に読み取る C++ コードを理解しようとしています。#define LFE_API(name) LFE_##name name以下の行が実際にどのように機能するか知っている人はいますか? 理解は#define LFE_API(name) LFE_##nameしていますが、最後の「名前」について混乱しています。

0 投票する
1 に答える
8640 参照

macros - C99 での引数が 0 の可変長マクロ

次のようなデバッグ コードがあります。

最後のマクロを使用して、エラーが発生した場所をデバッグ出力に挿入できるようにします。ただし、次のように関数を呼び出すと:

コードをC99 にしたいので、これをコンパイルすると、次のエラーが発生します。

への呼び出しを変更することでこれを解決できることを知っています

しかし、見栄えを良くする方法はありますか? ありがとう!

0 投票する
4 に答える
1984 参照

c++ - パラメータが省略記号のみで異なる関数のオーバーロード

文字列操作の一部をショートカットするために探しているこのロギングシステムがあります。

ロギングシステムは、機能マクロを介して使用され、その後、単一の関数呼び出しに転送されます。例#define Warning(...) LogMessage(eWarning, __VA_ARGS__);

次に、LogMessageはsnprintf新しいバッファに対してを実行し、インストールされているログターゲットにそのメッセージを表示します。printf、OutputDebugStringなど。

残念ながら、私たちが持っているバッファが十分に大きくないという問題に遭遇したので、出力が切り捨てられます。また、snprintfがva_argsを処理しようとするため、出力メッセージにパーセント記号が含まれている場合、このメソッドは失敗することに気付きました。最後に、ログメッセージの大部分はva_argsを使用しないため、文字列をコピーしてロガーに提示するのはばかげているようです。

それで、私の関数プロトタイプを考えると、楕円の存在に基づいてオーバーロードできるはずですか?言い換えれば、私は次のようなことができると仮定できるはずです:

私のグーグルの試みは特に有用なものを何も生み出しませんでした(他に何も一致しない場合は省略記号が一致することを示し、何も一致しないという私の要件とは異なります)、実装での最初の刺し傷はあいまいな関数呼び出しエラーを私に与えました。

エラーがあるので、これはできないことを受け入れる必要がありますが、それが使用しているコンパイラだけなのか、それとも間違っているのか疑問に思っています。私は同様の効果を達成することができます

...しかし、これは、渡されるパラメータの数だけで知ることができる典型的なケースでは無駄に思えます。たとえば、省略記号が何にも一致しない場合は、他の関数を選択しますか?これが機能しない場合、どの関数を呼び出すかをユーザーがマクロ名で決定する必要がない、私が試すことができる別の方法はありますか?正直なところ、誰かError("Buffer not 100% full");がログメッセージで無計画に言って、結果として「Buffer not 1007.732873e10ull」を受け取った場合、「無駄」についてはそれほど重要ではありません。

編集:私の例は「それをしないでください」によって答えられましたが、質問自体は答えることができますか?