c++ -CLI包装一组成员
本文关键字:组成员 包装 -CLI c++ | 更新日期: 2023-09-27 18:15:25
在c++中我有这样的东西:
class Params{
int X;
double Y;
SomeEnum E;
......
}
我想把它包装在c++ 'CLI中,这样c#用户就可以看到一个类具有与getter 'setter相同的参数列表。
问题是我有很多类似params的类,每个类都有相当多的params。是否有一种简洁的方式来包装它,或者我必须手工复制每个参数?
如果您的最终目标是为每个类(并且它们是基本的POD类,没有什么花哨的)都拥有c++和c++/CLI定义,则可以使用预处理器。
#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;
};
我有个想法。而不是使用:
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个参数类,在本机代码中编写1个(元组)。
我知道这个线程现在有点老了,但这里是我的建议使用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
}
c++ 'Cli包装器可能会变得混乱,并且往往需要大量的维护时间
您可以使用SWIG来自动转换过程