-1

可変引数を持つ関数を作成するブースト以外の方法はありますか? 私は知っている引数の型 引数の数とそれらはいつもの5 未満、すべて同じタイプ

引数の数を指定したり、パラメーター リストを null で終了したりしない方法があるかどうかを知る必要があります。

4

6 に答える 6

3

私は引数の型を知っており、通常は 5 未満です。

よりも大きくならない場合は5、単純なオーバーロードが機能する可能性があります。5 つ未満の引数を受け入れる他のすべてのオーバーロードから最大数の引数を受け入れるオーバーロードを呼び出すか、ワーカー (内部) 関数を定義して、オーバーロードからこれを呼び出します。

可能であれば、オーバーロードされた関数の数を減らすのに役立つ場合は、一部のパラメーターにデフォルト値を使用できます。

C++11 では、 variadic-templateを使用できます。

于 2012-08-09T06:21:43.873 に答える
1

すべて同じ型の最大 5 つの引数の場合、単純なオーバーロードでうまくいく可能性があります。

より一般的に、同じ型の任意の数の引数をサポートするには、 などのコレクションを渡すだけstd::vectorです。

各呼び出しでオンザフライでそのようなコレクションを構築する C++03 手法については、私の他の回答を参照してください。C++11 の場合、Visual C++ をサポートする必要がない場合は、中括弧初期化子リストを実際の引数として使用できます。

于 2012-08-09T07:20:15.630 に答える
0

cstdargはあなたが探しているものですかこれは、可変数の引数を持つ関数を生成するための標準のC++の方法です。

于 2012-08-09T06:22:42.827 に答える
0

va_listを使用して変数引数を渡すことができるはずです。

于 2012-08-09T06:23:40.850 に答える
0

あなたはできる:

  • C++11 を使用している場合は、可変個引数テンプレートを使用できます。それ以外の場合は...
  • オーバーロードを提供する
  • alaを認識できるいくつかのセンチネル値にデフォルト設定される引数を使用しますf(const T& v1 = missing, const T& v2 = missing, ...) { if (v5 != missing) ...
  • オプションでデータ型から構築でき、それがあったかどうかを追跡するブール値を持つ単純なヘルパー テンプレートを作成します。
    • new/delete (シンプルで安全ですが遅い) を使用するか、整列されたバッファーを配置したり、手動で破棄したりして、デフォルトのコンストラクターを使用せずに型をサポートする必要がある場合があります (手間がかかり、new間違いを犯しやすくなりますが、高速です)。
  • 一部のコンパイラは可変長マクロをサポートしています
  • 呼び出し構文を少し変更する準備ができている場合は、いくつでも使用できます。
    • ベクトルを受け入れる (型が異なる場合は共用体またはバリアントを使用)
    • 配列を受け入れる (おそらくtemplate <size_t N> void f(T (&data)[N]) { ... }トリックを使用して、コンパイラに配列サイズを自動的に提供させる)
    • operator,orなどの演算子を使用して追加の値を指定できるある種の lhs オブジェクトoperator<<
于 2012-08-09T06:40:23.290 に答える
0

一般的な C++03 ソリューションとして、呼び出されたオブジェクトへの参照を返すセッターを提供して、再度呼び出せるようにすることができます。そしてまた。チェーンと呼ばれるなど。

これは、iostreams が に使用するのと同じスキームですoperator<<

例えば

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

void foo( char const s[] )
{
    cout << s << endl;
}

class StringBuilder
{
private:
    string      s_;

    template< class Type >
    string fastStringFrom( Type const& v )
    {
        stringstream stream;
        stream << v;
        return stream.str();
    }

    char const* fastStringFrom( char const* s )
    {
        return s;
    }

    string const& fastStringFrom( string const& s )
    {
        return s;
    }

public:
    template< class Type >
    StringBuilder& operator<<( Type const& v )
    {
        s_ += fastStringFrom( v );
        return *this;                   // Supports chaining.
    }

    operator string const& () const { return s_; }
    operator char const* () const { return s_.c_str(); }
};

int main()
{
    typedef StringBuilder S;

    foo( S() << "6*7 = " << 6*7 << "." );   // Any number of arguments.
}

引数の値をテキストに変換する代わりに、必要なことは何でも行うだけです。たとえば、可能な型の固定セットを使用して、引数をコレクションに格納できます。

Visual C++ コンパイラをサポートする必要がない場合は、代わりに C++11可変個引数テンプレートを使用できます。

于 2012-08-09T06:31:21.660 に答える