首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++-CLI包装一组成员

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

Stack Overflow用户
提问于 2011-11-20 23:21:28
回答 4查看 948关注 0票数 3

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

代码语言:javascript
复制
    class Params{
    int X;
    double Y;
    SomeEnum E;
    ......
    }

我想将其封装在C++\CLI中,以便C#用户可以看到与getters\setter具有相同参数列表的类。

问题是我有很多类参数,每个类都有相当多的参数。有没有一种整洁的方法来包装它,或者我必须手动复制每个参数?

EN

回答 4

Stack Overflow用户

发布于 2011-11-21 01:42:05

如果您的最终目标是同时拥有每个类的C++和C++/CLI (它们是基本的POD类,没什么特别的),那么您可以使用预处理器。

代码语言:javascript
复制
#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
EN

Stack Overflow用户

发布于 2011-11-21 23:54:40

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

代码语言:javascript
复制
class Params1{
  int X;
  double Y;
}
.
.
.

在本机代码中使用std::tuple<int,double>。而在托管端,您将拥有

代码语言:javascript
复制
#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个(元组)。

票数 0
EN

Stack Overflow用户

发布于 2013-06-06 15:11:38

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

首先,您编写了一个makro,它定义了所有的变量/属性。这个makro使用另一个makro作为参数:

代码语言:javascript
复制
#define VARIABLES(anothermakro) \
    anothermakro( int , X ) \
    anothermakro( double , Y ) \
    anothermakro( SomeEnum , Z ) 

然后创建两个类:

代码语言:javascript
复制
ref class ManagedClass 
{
    #define PROPERTY(type, name) property type name;
    VARIABLES( PROPERTY )
    #undef PROPERTY
}

代码语言:javascript
复制
class UnmanagedClass
{
    #define PROPERTY(type, name) type name;
    VARIABLES( PROPERTY )
    #undef PROPERTY
}

然后,您还可以添加如下内容

代码语言:javascript
复制
void ManagedClass::assign(UnmanagedClass const & value) 
{
    #define ASSIGN(type, name) this->name = value.name;
    VARIABLES( ASSIGN )
    #undef ASSIGN
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8202500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档