【发布时间】:2019-12-14 18:34:31
【问题描述】:
我想实现一个完全不使用 C 宏的 C# 属性的 C++ 等效项。我创建了一个模板,它基本上以get() 和set() 的更好的方式设置或检索内部值。在构造函数中还有两个std::function 类型的参数,我可以在其中覆盖默认的getter 和setter 方法。
template<typename T>
class Property
{
public:
Property(T initialValue, std::function<void(T&)> setter, std::function<T&()> getter)
{
Value = initialValue;
Setter = setter;
Getter = getter;
}
~Property()
{
}
void operator =(T value)
{
if(Setter == nullptr)
{
Set(value);
}
else
{
Setter(value);
}
}
T& operator ()()
{
if(Getter == nullptr)
{
return Get();
}
else
{
return Getter();
}
}
void Set(T& value)
{
Value = value;
}
T& Get()
{
return Value;
}
private:
T Value;
std::function<void(T&)> Setter = nullptr;
std::function<T&()> Getter = nullptr;
}
以下代码 sn-p 显示了int 类型的Property 对象的定义。 (getter 和 setter 被 lambda 表达式覆盖。)
Property<int> prop = Property<int>(0,
[&](int& val)
{
// some code inside the overridden setter
prop.Set(val);
},
[&]() -> int&
{
// some code inside the overridden getter
return prop.Get();
});
Getter 和 setter 的调用方式如下:
int foo = prop();
prop = foo;
我认为一切都会好起来的,而且确实如此。在我尝试将一个不包含标准构造函数的类作为模板类型传递之前,它确实如此。我知道,声明 T Value; 会导致问题,但我想不出任何替代方案或解决方法。
也许,您知道如何使这个概念适用于基本类型、类和没有标准构造函数的类。
【问题讨论】:
标签: c++ class templates constructor properties