作为一个假设性的问题,我想使用lambda作为类方法。我理解在专业环境中这是不好的,但我还是非常好奇。最好用一个例子来展示我想要做什么。这里是一个关于复数的基本类:
class Complex {
private:
double re, im;
public:
Complex() : re(0.0), im(0.0) {}
Complex(double re, double im) : re(re * 1.0), im(im * 1.0) {}
Complex(const Complex &c) = default;
~Complex() = default;
function<double(void)> getRe = [=]() -> double { return re; };
function<void(double)> setRe = [&](double re) -> void { this->re = re; };
function<double(void)> getIm = [=]() -> double { return im; };
function<void(double)> setIm = [&](double im) -> void { this->im = im; };
};
起初我尝试使用
auto
代替显式指定函数类型,但是错误提示说我不能在非静态字段中使用auto
。看起来似乎确实可以工作,因为它显然产生了期望的行为。我用它来绘制一些使用OpenGL的分形图形,因此最终需要进行一些相当密集的工作。
正如我所说,似乎可以工作,我使用引用捕获来设置setter,特别是因为我想到由于
this
是对当前实例的引用,可能会需要它;而对于getter,我使用值捕获,因为默认情况下标识符会搜索(在这种情况下)类范围并找到字段。我有两个问题:
- 我还没有使用Visual Studio测试过,但在我使用的CLion和MSVC编译器中,
this
被强调为一个不存在的变量(即使它“工作”)。你有什么想法吗? - 这个类最终变得很慢。从使用像
double getRe() {return re;}
这样的普通getter和setter时绘图是完全瞬间完成的,到需要2-3秒钟。为什么会发生这种情况?
std::function
不是 lambda。它是一种类型擦除的类似函数的类型,可以保存 lambda。 - Justinstd::function
是可变的,因此其他代码可以用任意其他方法替换这些方法。 - Mooing Duckstd::function
成员。如果您为该类使用一些动态分配,减速很可能是由于更多的内存分配引起的。在普通情况下,这些函数地址是硬编码到汇编中的。 - llllllllllpublic
的getter和setter方法,而这些方法并没有做任何保护成员或提供其他附加值,那么你只比拥有一个public
成员好一点点。任何傻瓜都可以使用getter来查看值,并使用setter将成员更改为他们选择的任何值,就像一个public
成员一样不被察觉。你所得到的只是一个放置调试器断点以尝试找出谁是傻瓜的地方。 - user4581301