Bre*_*hns 6 c++ lambda gcc mingw c++11
我非常喜欢C#中属性的概念,作为一个小小的项目,我一直在修改用C++实现它们的想法.我遇到了这个示例/sf/answers/414721611/这看起来相当不错,但我忍不住认为lambdas和非静态数据成员初始化可能会使用一些非常好的语法有这个想法.这是我的实现:
#include <iostream>
#include <functional>
using namespace std;
template< typename T >
class property {
public:
property(function<const T&(void)> getter, function<void(const T&)> setter)
: getter_(getter),
setter_(setter)
{};
operator const T&() {
return getter_();
};
property<T>& operator=(const T& value) {
setter_(value);
}
private:
function<const T&(void)> getter_;
function<void(const T&)> setter_;
};
class Foobar {
public:
property<int> num {
[&]() { return num_; },
[&](const int& value) { num_ = value; }
};
private:
int num_;
};
int main() {
// This version works fine...
int myNum;
property<int> num = property<int>(
[&]() { return myNum; },
[&](const int& value) { myNum = value; }
);
num = 5;
cout << num << endl; // Outputs 5
cout << myNum << endl; // Outputs 5 again.
// This is what I would like to see work, if the property
// member of Foobar would compile...
// Foobar foo;
// foo.num = 5;
// cout << foo.num << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我可以正常使用我的属性类[参见main()]中的示例,但是使用g ++ 4.7的MinGW并不特别关心我将该属性用作数据成员的尝试:
\property.cpp: In lambda function:
\property.cpp:40:7: error: invalid use of non-static data member 'Foobar::num_'
Run Code Online (Sandbox Code Playgroud)
所以看起来我的属性实现的概念是有效的,但它可能是徒劳的,因为我无法从我的lambda函数访问其他数据成员.我不确定标准是如何定义我在这里要做的,我完全没有运气,或者我只是不在这里做某事?
property<int>您的属性是与包含对象( 的实例)不同的对象( 的实例Foobar)。因此,它的成员函数会传递一个不同的成员函数this,而不是您需要访问的成员函数num_,因此您不能这样做。如果 lambda 是在 的非静态成员函数中定义的Foobar,那么它们将捕获该函数的this参数,并且可以访问封闭对象的成员(明确地,如this->num_)。但 lambda 是在类中定义的,其中非静态数据成员实际上并不存在。如果 lambda确实可以访问num_,num_的哪个实例Foobar, 会是哪个?
我看到的最简单的解决方案是让属性存储指向封闭对象的指针。这样,它就可以自由访问其非静态成员。缺点是声明稍微复杂一些(您必须这样做property<int, Foobar> num)并且需要通过传递this指针来初始化属性。因此,您将无法在类中执行此操作,它必须位于构造函数的初始化列表中,从而否定了 C++11 数据成员初始化的优势。
此时,thislambda 无论如何都可以捕获(通过值,而不是通过引用!),因此如果您将属性的初始化移至 Foobar 的构造函数,您的代码实际上只需进行最少的更改即可工作:
Foobar::Foobar():
num {
[this]() { return this->num_; },
[this](const int& value) { this->num_ = value; }
}
{
}
Run Code Online (Sandbox Code Playgroud)
有谁知道this传递给恰好被调用的任何构造函数的 是否可用于类定义中的非静态成员初始化?我怀疑不是,但如果是,则相同的构造将在类定义中起作用。
| 归档时间: |
|
| 查看次数: |
3619 次 |
| 最近记录: |