__declspec(property())
http://blogs.wankuma.com/melt/archive/2007/03/12/66223.aspx
プロパティ (C++)
http://msdn.microsoft.com/ja-jp/library/yhfk0thd(v=vs.110).aspx
VC++2005 の頃からあったのですが、MS-C++の場合はプロパティを作れたのですね…なるほど。
__declspec(property())な構文を作れば、VB/C# のようにプロパティでアクセスできるという便利さ。これだと、Model を作る時に良さそうってことで、早速 PROPERTY マクロを作成。
#include "stdafx.h"
#include <afxwin.h>
#include <iostream>
#include <string>
class Model
{
private:
int _value;
public:
__declspec(property(get=GetValue, put=SetValue)) int Value;
public:
int GetValue() { return _value; }
void SetValue( int value ) { _value = value; }
// マクロで定義する
#define PROPERTY( _t, _m ) \
private: _t m_##_m ; \
public: \
__declspec(property(get=get##_m, put=set##_m)) _t _m ; \
_t get##_m() { return m_##_m; } \
void set##_m( _t value ) { m_##_m = value; };
public:
PROPERTY( int, Number );
PROPERTY( CString, Name );
PROPERTY( double, Pressure );
PROPERTY( std::string, MyName );
};
int _tmain(int argc, _TCHAR* argv[])
{
Model model;
model.Value = 10;
model.Name = L"masuda tomoaki";
model.Number = 10;
model.Pressure = 1.2f;
model.MyName = "tomoaki";
std::cout << "name: " << model.Name << std::endl
<< "num: " << model.Number << std::endl;
std::cout << "myname: " << model.MyName << std::endl;
return 0;
}
このコードでは CString を cout しているときには文字化けしていますが、まぁ大抵のところはok。
これで、なんらかの形でプロパティ名とバインドさせれば、INotify を実装できるかな。
