2

私はac#で書かれたプログラムをc++コードに変換しています。次のような ac# 関数宣言があります。

// c# function declaration
int DerivationFunc(int id, params BasicFeature[] args); 

だから私はそれをc ++に変換します

// c++ function declaration
int DerivationFunc(int id, BasicFeature* args, int argsNum); // argsNum denotes the size of the array

関数を呼び出すときに問題が発生しました。C# では、パラメーターに配列定義を指定して関数を呼び出すことができます。

// c# function calling
DerivationFunc(16, new BasicFeature[] {query, keyword});

では、C++ でこれを行うにはどうすればよいでしょうか。

// c++ function calling
DerivationFunc(16, /*something like BasicFeature[] {query, keyword} but with the right syntax*/, 2);
4

2 に答える 2

4

std::initializer_listを取るように関数を書き直すことができます:

#include <initializer_list>
#include <iostream>

struct BasicFeature {
} query, keyword;

int DerivationFunc(int id, std::initializer_list<BasicFeature> args)
{
    std::cout << args.size() << " element(s) were passed.\n";
    return id;
}

int main()
{
    DerivationFunc(42, { query, keyword });
}
于 2013-06-24T08:57:27.937 に答える
0

の使用が許可されていない場合std::initializer_listは、少し醜いハックを提案できます。

#include <vector>
#include <iostream>

enum BasicFeature {
    query,
    keyword
};

template<typename T>
class init_list
{
public:
    init_list &operator<<( typename T::value_type value )
    {
        m_list.push_back(value);
    }
    operator const T() const { return m_list; }
private:
    T m_list;
};

void DeriviationFunc( int id, const std::vector<BasicFeature> &args )
{
    std::cout << id << std::endl;
    std::cout << args.size() << std::endl;
    std::cout << args[0] << std::endl;
}

int main()
{
    DeriviationFunc(16, init_list<std::vector<BasicFeature> >() << query << keyword);
    return 0;
}
于 2013-06-24T09:27:52.453 に答える