【问题标题】:Is it possible to auto-generate property accessors in Visual Studio 2015 for c++/cx?是否可以在 Visual Studio 2015 中为 c++/cx 自动生成属性访问器?
【发布时间】:2016-11-11 06:54:23
【问题描述】:

从成员变量自动生成属性代码会很棒(很像访问器函数的 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 功能或可靠的 3rd 方插件(可以购买)。

谢谢,

【问题讨论】:

  • 它是 C++,应该很难。如果不是,那么任何人都可以做到,而我们不能做到这一点。如果它完全可用,那么您必须在类向导中找到它。但我不会太相信了解 C++/CX 语义。你必须尝试。
  • 好吧,我对语言本身没有太多问题。我使用 C++/C++11 已经很多年了,到目前为止,向 C++/CX 的过渡还不算太糟糕。主要是我在寻找 UI/dev 环境的便利功能。
  • 题目讲的是C++/CX,题目讲的是C++。是哪一个?

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


【解决方案1】:

是的,这在一定程度上是可能的。如果我没有误解,那么是的,如果 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);
}

【讨论】:

    【解决方案2】:

    从纯粹的 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      • 1970-01-01
      • 2015-10-31
      • 2010-12-09
      • 1970-01-01
      相关资源
      最近更新 更多