是否可以以某种方式存储参数包供以后使用?
template <typename... T>
class Action {
private:
std::function<void(T...)> f;
T... args; // <--- something like this
public:
Action(std::function<void(T...)> f, T... args) : f(f), args(args) {}
void act(){
f(args); // <--- such that this will be possible
}
}
Run Code Online (Sandbox Code Playgroud)
然后是:
void main(){
Action<int,int> add([](int x, int y){std::cout << (x+y);}, 3, 4);
//...
add.act();
}
Run Code Online (Sandbox Code Playgroud) 在数学,如果z = x+y/2,然后z都是会改变的,每当我们更换的价值x和y。我们可以在编程中做到这一点,而不必z每次更改xand 的值时都进行专门更新y吗?
我的意思是这样的东西行不通,对吧?
int x;
int y;
int z{x + y};
cin >> x;
cin >> y;
cout << z;
Run Code Online (Sandbox Code Playgroud)
如果您对我为什么需要它感到困惑,我希望实时显示该变量,并在rhs变量进行更改时自动更新该变量。
就像杀死一只小怪并获得金币一样,净资产(现金+自己物品的价值)也会发生变化。或者,汽车的速度计会根据您行驶的速度或速度而变化。
我仍然觉得C++提供了一些无法打败的东西.我不打算在这里开始一场火焰战,如果你对不喜欢C++有强烈的意见,请不要在这里发泄它们.我很想听听C++大师们为什么坚持下去.
我对C++的方面特别感兴趣,这些方面鲜为人知或未充分利用.
编辑:人们,请至少粗略阅读其他回复,以确保你没有复制已经说过的内容,如果你同意别人所说的话,那就投票吧!
我有一个像这样的表达式/公式
std::string expr="((A>0) && (B>5 || C > 10))";
Run Code Online (Sandbox Code Playgroud)
我做了一些研究,似乎如果已知A,B,C值,通过在C++程序中嵌入Lua或Python,有些eval函数可以替代A,B和C并返回true或false.
但是当我不知道所有的价值时会发生什么?让我们说A是已知的,它是-1.如果A为-1,则无论B或C的值如何,公式都将评估为"假".
我可以在不事先知道所有变量的情况下评估公式吗?例如,如果A为10,则查找B的值并再次重新评估是有意义的.我们如何解决这些问题?想法?
关于我尝试做的一些背景:我正在尝试实现一个做量子力学的库.由于量子力学基本上只是线性代数,我使用下面的犰狳线性代数库.Armadillo使用惰性求值来对矩阵做一些聪明的技巧,这样可以很好地抽象出实际情况并且看起来接近matlab代码.
我想做类似的事情,但我也希望能够使用auto,这是犰狳(或本征)无法实现的.
我一直在寻找一下,这个答案包含了我认为实现这个的典型方法:https://stackoverflow.com/a/414260/6306265
这种方法的问题在于你写的时候
auto C = A+B;
Run Code Online (Sandbox Code Playgroud)
你得到的C是一个matrix_add,而不是一个matrix.即使matrix_add表现得足够相似matrix,matrix_add包含引用A并B使其难以随身携带的事实.例如
auto A = matrix(2,2,{0,1,0,1});
auto B = matrix(2,2,{1,0,1,0});
auto C = A+B;
C.printmatrix(); // 1,1 ; 1,1
Run Code Online (Sandbox Code Playgroud)
但
auto A = matrix(2,2,{0,1,0,1});
auto B = matrix(2,2,{1,0,1,0});
auto C = A+B;
A(0,0) = 1;
C.printmatrix(); // 2,1 ; 1,1
Run Code Online (Sandbox Code Playgroud)
这是违反直觉的.由于数学上直观的行为是我想要实现的,这是一个问题.
更糟糕的是当我这样做
auto sumMatrices(const matrix& A, const matrix& B)
{
return A+B; …Run Code Online (Sandbox Code Playgroud) 我刚读过:
并注意到它有点陈旧,大多数答案都与2011年之前的C++有关.这些天我们有语法lambda,甚至可以推断出返回类型,所以懒惰的评估似乎归结为只是传递它们:而不是
auto x = foo();
Run Code Online (Sandbox Code Playgroud)
你执行
auto unevaluted_x = []() { return foo(); };
Run Code Online (Sandbox Code Playgroud)
然后评估您需要的时间/地点:
auto x = unevaluted_x();
Run Code Online (Sandbox Code Playgroud)
似乎没有更多的东西了.但是,其中一个答案建议使用带异步启动的期货.有人可以用C++或更抽象的方式列出为什么/如果期货对懒惰评估工作有重要意义吗?似乎期货很可能会被热切地评估,但简单地说,在另一个线程上,并且可能没有创建它们的任何优先级; 无论如何,它应该依赖于实现,对吧?
另外,还有其他现代C++构造在懒惰评估的背景下有用吗?
假设您编写了一个包含一些操作的矩阵类:
class matrix
{
public:
double operator()(size_t i, size_t j) const;
...
};
matrix operator*(const matrix &lhs, const matrix &rhs);
...
Run Code Online (Sandbox Code Playgroud)
推迟对某些矩阵表达式的评估是有意义的:m0*m1*m2*m3*m4(这是一系列的四个operator*调用)可以从使用动态编程矩阵链乘法算法中受益; 非常常见的m0*m1 t具有非常有效的dgemm实现,等等.
因此,它需要将实际计算推迟到需要时.这将以上内容更改为:
class matrix
{
private:
/*
* Pointer to an abstract base class - either an actual matrix,
* or an expression tree. */
std::shared_ptr<matrix_imp> m_imp;
public:
// Forces compaction -
double operator()(size_t i, size_t j) const;
...
};
/* Lazy; creates a matrix …Run Code Online (Sandbox Code Playgroud)