是否可以在Visual Studio 2015中为c ++ / cx自动生成属性访问器?

时间:2016-07-08 16:08:45

标签: visual-studio visual-studio-2015 refactoring c++-cx

从成员变量自动生成属性代码会非常棒(很像VisualAssist或Resharper功能,用于访问器功能)。我发现这些问题已经过时了:

How to generate getters and setters in Visual Studio?

How to generate automatic properties (get, set) for Visual Studio 2008 C++

这个问题适用于C#:

https://stackoverflow.com/questions/32864873/generate-property-in-one-line-in-visual-studio-2015

但我似乎无法在VS2015中找到任何关于C ++的明确答案。

有没有人找到办法做到这一点?我更喜欢内置的VS功能或可靠的第三方插件(购买还可以)。

谢谢,

2 个答案:

答案 0 :(得分:0)

是的,这在一定程度上是可能的。如果我没有误解,那么有一种方法可以缩短属性,如果get和set没有做任何花哨的事情:

public:
property int MyValue{
    int get(void){return _myValue;}
    void set(int value){_myValue = value;}
}

private:
int _myValue;

可以很容易地缩短为:

`property int MyValue;`

旁注:如果您的财产需要PropertyChanged事件,您将不得不做很多事情:

public:
property int MyValue{
    int get(void){return _myValue;}
    void set(int value){
        _myValue = value;
        NotifyPropertyChanged("MyValue");
    }
}

virtual event PropertyChangedEventHandler^ PropertyChanged

private:
int _myValue;

void NotifyPropertyCHanged(Platform::String^ prop){
    PropertyChangedEventArgs^ args = ref new PropertyChangedEventArgs(prop);
    PropertyChanged(this, args);
}

答案 1 :(得分:0)

从纯C ++的角度来看,并假设您不反对使用非标准的Microsoft语言扩展,则可以使用__declspec(property

struct Entity {
    //**************************************************** PROPERTY: heading
    float heading_get()      const;
    void  heading_set(float value);
    __declspec(property(get = heading_get, put = heading_set)) float heading;

private:
    float _heading = {};
};

float Entity::heading_get()      const { return _heading;  }
void  Entity::heading_set(float value) { _heading = value; }

void usage() {
    Entity entity;
    entity.heading = std::clamp<float>(entity.heading, 0, 360);
}

为简单起见,您可以使用宏简化此操作:

#define PROPERTY(TYPE, NAME)                    \
    TYPE _##NAME;                               \
    TYPE get_##NAME() const { return _##NAME; } \
    void set_##NAME(TYPE _) { _##NAME = (_);  } \
                                                \
    __declspec(property(get = get_##NAME, put = set_##NAME)) TYPE NAME

它不漂亮,但是会为您提供真实属性 ish

screenshot from Visual Studio