3

私が現在行っていることは次のとおりです。

std::vector<sometype> myparams;
...
while (...)
  myparams.push_back(somevalue);
...

somefunction(myparams[0], myparams[1], myparams[2], otherargument);

私は1から100の引数を受け入れるsomefunctionの多くの実装を持っています。一部の関数を変更することはできませんが、それを使用するためのより良い方法があるかどうか、したがって、引数としてベクトルを受け入れ、ベクトルのすべての値でいくつかの関数を呼び出す別の関数/マクロを作成することによって、myparamsのサイズが何であれ知りたいです引数として。

何か案が ?

どうもありがとう。

4

4 に答える 4

3

まあ、あなたは実際にそれをするべきではありませんが、ここに行きます:) boost::プリプロセッサの使用:

#include "stdafx.h"
#include <vector>

void somefunction(int p1)
    { std::cout << p1 << " " << std::endl;}
void somefunction(int p1, int p2) 
    { std::cout << p1 << " " << p2 << std::endl;}
void somefunction(int p1, int p2, int p3) 
    { std::cout << p1 << " " << p2 << " " << p3 << std::endl;}
void somefunction(int p1, int p2, int p3, int p4)
    { std::cout << p1 << " " << p2 << " " << p3 << " " << p4 << std::endl;}

#define MAX_ARGS 4

#include <boost/preprocessor/repetition.hpp>

void UnpackVector(const std::vector<int> &v)
{
    #define MACRO(z, n, _) \
    case n: somefunction(\
    BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_INC(n), v[,]BOOST_PP_INTERCEPT) \
    );break;

    switch(v.size() - 1)
    {
        BOOST_PP_REPEAT(MAX_ARGS, MACRO, nil)
    }
}

void Run()
{
    int v_[] = { 42, 41, 40, 39 };
    std::vector<int> v(v_, v_ + sizeof(v_) / sizeof(int));

    UnpackVector(v);
}

笑いのためだけに。

于 2012-05-30T13:43:48.537 に答える
1

本当にありえない。C++ の各関数呼び出し式には、固定数の引数があります。したがって、100 個の関数呼び出し式が必要になります。いえ

switch (myparams.size()) {
  case 0: somefunction(); break;
  case 1: somefunction(myparams[0]); break;
  case 2: somefunction(myparams[0], myparams[1]); break;
  // etc.

これにはBoost Preprocessorを使用することをお勧めします。

于 2012-05-30T12:03:37.000 に答える
0

いくつかの関数にイテレータのペアを持たせることができます。そうすれば、すべて同じ署名を持つ 0 ... 無限の引数を取得できます。

于 2012-05-30T15:07:56.507 に答える
0

引数のセットが頻繁に一緒に使用される場合、それらを に格納し、structその構造体を受け入れる既存の関数のラッパーを作成してみませんか?

于 2012-05-30T12:02:01.510 に答える