C ++ - 包装一组成员的CLI

时间:2011-11-20 15:21:28

标签: c# c++-cli

在C ++中我有类似的东西:

    class Params{
    int X;
    double Y;
    SomeEnum E;
    ......
    }

我想将它包装在C ++ \ CLI中,以便C#用户可以看到一个具有与getter \ setter相同的params列表的类。

麻烦的是,我有许多类似Params的课程,每个课程都有很多参数。 是否有一种巧妙的方法来包装它,或者我必须手动复制每个参数吗?

4 个答案:

答案 0 :(得分:1)

如果您的最终目标是为每个类同时拥有C ++和C ++ / CLI定义(并且它们是基本的POD类,没有任何花哨的东西),您可以使用预处理器。

#ifdef _MANAGED
    #define PARAMS_CLASS(name) ref class name
#else
    #define PARAMS_CLASS(name) class name
#endif

PARAMS_CLASS(Params)
{
public:
    int X;
    double Y;
    SomeEnum E;
};

答案 1 :(得分:0)

这是一个想法。而不是使用:

class Params1{
  int X;
  double Y;
}
.
.
.

在本机代码中使用std::tuple<int,double>。在管理方面你会有

#include <tuple>

public ref class ManagedParam1
{
std::tuple<int,double> * tmp_ptr;
public:
ManagedParam1( std::tuple<int,double> * ptr ) : tmp_ptr(ptr) {  }
property int intProp 
{
    int get () {return std::get<0>(*tmp_ptr);} 
    void set (int value) {std::get<0>(*tmp_ptr) = value;}
}
property double doubleProp 
{
    double get () {return std::get<1>(*tmp_ptr);} 
    void set (double value) {std::get<1>(*tmp_ptr) = value;}
}

};

public ref class ManagedParam2
{
std::tuple<int,double,int> * tmp_ptr;

public: 
ManagedParam2( std::tuple<int,double,int> * ptr ) : tmp_ptr(ptr) {  }
property int intProp1 
{
    int get () { return std::get<0>(*tmp_ptr); }
    void set(int value) {   std::get<0>(*tmp_ptr) = value;}
}
property double doubleProp 
{
    double get () {return std::get<1>(*tmp_ptr);} 
    void set (double value) {std::get<1>(*tmp_ptr) = value;}
}
property int intProp2 
{
    int get () {return std::get<2>(*tmp_ptr);} 
    void set(int value) {   std::get<2>(*tmp_ptr) = value;}
}
};

因此,您将在托管代码中编写N个params类,在本机代码中编写1个(元组)。

答案 2 :(得分:0)

我知道这个帖子现在有点老了,但这是我使用makros的建议。

首先编写一个makro,它定义了所有变量/属性。这个makro将另一个makro作为论点:

#define VARIABLES(anothermakro) \
    anothermakro( int , X ) \
    anothermakro( double , Y ) \
    anothermakro( SomeEnum , Z ) 

然后你创建两个类:

ref class ManagedClass 
{
    #define PROPERTY(type, name) property type name;
    VARIABLES( PROPERTY )
    #undef PROPERTY
}

class UnmanagedClass
{
    #define PROPERTY(type, name) type name;
    VARIABLES( PROPERTY )
    #undef PROPERTY
}

然后你也可以添加像

这样的东西
void ManagedClass::assign(UnmanagedClass const & value) 
{
    #define ASSIGN(type, name) this->name = value.name;
    VARIABLES( ASSIGN )
    #undef ASSIGN
}

答案 3 :(得分:0)

C ++ \ Cli包装器可能会变得混乱,并且往往需要大量的维护时间

您可以使用SWIG自动执行转化过程