相关疑难解决方法(0)

如何存储可变参数模板参数?

是否可以以某种方式存储参数包供以后使用?

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)

c++ variadic-templates c++11

79
推荐指数
3
解决办法
3万
查看次数

如何使变量始终等于某些计算的结果?

在数学,如果z = x+y/2,然后z都是会改变的,每当我们更换的价值xy。我们可以在编程中做到这一点,而不必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++11

58
推荐指数
8
解决办法
5397
查看次数

C++能做什么在任何其他语言中都太难或太乱了?

我仍然觉得C++提供了一些无法打败的东西.我不打算在这里开始一场火焰战,如果你对不喜欢C++有强烈的意见,请不要在这里发泄它们.我很想听听C++大师们为什么坚持下去.

我对C++的方面特别感兴趣,这些方面鲜为人知或未充分利用.

编辑:人们,请至少粗略阅读其他回复,以确保你没有复制已经说过的内容,如果你同意别人所说的话,那就投票吧!

c++ unique

30
推荐指数
11
解决办法
6666
查看次数

从C++调用Python或Lua来计算表达式,仅在需要时计算未知变量

我有一个像这样的表达式/公式

 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并返回truefalse.

但是当我不知道所有的价值时会发生什么?让我们说A是已知的,它是-1.如果A为-1,则无论B或C的值如何,公式都将评估为"假".

我可以在不事先知道所有变量的情况下评估公式吗?例如,如果A为10,则查找B的值并再次重新评估是有意义的.我们如何解决这些问题?想法?

c++ python lua lazy-evaluation

19
推荐指数
4
解决办法
1048
查看次数

如何在C++中将惰性求值与auto结合起来

关于我尝试做的一些背景:我正在尝试实现一个做量子力学的库.由于量子力学基本上只是线性代数,我使用下面的犰狳线性代数库.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包含引用AB使其难以随身携带的事实.例如

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)

c++ templates c++11

17
推荐指数
1
解决办法
714
查看次数

C++ 14/17中的懒惰评价 - 只是lambdas还是期货等?

我刚读过:

C++中的延迟评估

并注意到它有点陈旧,大多数答案都与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++构造在懒惰评估的背景下有用吗?

c++ lambda lazy-evaluation c++11 std-future

13
推荐指数
2
解决办法
2595
查看次数

保证检测临时 - >命名点

假设您编写了一个包含一些操作的矩阵类:

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)

c++ move lazy-evaluation c++11

8
推荐指数
1
解决办法
91
查看次数