2012-04-21 18 views
0

元はMATLABで書かれたプロジェクトのC++クローンをビルドします。 MATLABのような動的型付けされた言語とC++のような静的型付けされた言語との間には避けられない相違点があるので、可能な限りオリジナルに近いコードを "翻訳"したいと思います。C++の混合型可変長引数リスト(varargin、* args、...)

私の質問は、混合型の引数を含むことができる関数のパラメータとして可変長引数リストです。

MATLABは、関数のパラメータとしてvararginがあります。この非常に快適にPythonで

varargin Variable length input argument list. 
    Allows any number of arguments to a function. The variable 
    varargin is a cell array containing the optional arguments to the 
    function. varargin must be declared as the last input argument 
    and collects all the inputs from that point onwards. In the 
    declaration, varargin must be lowercase (i.e., varargin). 

*args**kwargsハンドル。

C++でこのような柔軟性を得るにはどうすればよいですか?私が使用すべき標準の引数リストクラスはありますか?

+1

stdarg.h http://en.wikipedia.org/wiki/Stdarg.hまたはcstdargを参照してください。 –

+2

*省略記号*( 'printf'スタイル)以外にも、タイプセーフなバージョン(コンパイル時に解決)を可能にするバリデーショナルテンプレートを使用することができます。 –

+0

実際のタスクでは、実際にはCまたはC++コードを生成できます。一番美しいものではありませんが、ただそれを使うだけでかなりの痛みを避けることができます。私は 'varargin'が*省略記号*を使っているだけだと思っていますが、ツールがあなたにそれをさせるようにしてください。 –

答えて

1

いくつかの(単純な)タイプの引数だけを渡す場合は、引数としてstd::vector<>を渡すのは簡単で簡単です。

struct Option { 
    union { 
     int Int; 
     float Float; 
    } Number; 
    string String; 
}; 

オプションで、switch文で使用するため、オプションの構造体にTypeフィールドを追加することができます。

通常次のような構造体を作成します。

C++ 11では、std :: stringを共用体で使用することも可能ですが、それについては100%確実ではありません。

<cstdarg>は別の解決策であり、vsprintfなどのC関数を使用している場合は便利です。

+3

'boost :: any' –

+1

もチェックしてください。私はまだそれほど単純なケースで誰かにブーストを提案するときには少し注意深いです。 –

+0

同じです。残念ながら、このタイプのバリアントストレージは、最初に表示されるほど単純ではありません。 –

関連する問題