相关疑难解决方法(0)

向C#添加`lazy`关键字的问题

我想写这样的代码:

class Zebra
{
    public lazy int StripeCount
    {
        get { return ExpensiveCountingMethodThatReallyOnlyNeedsToBeRunOnce(); }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:为什么?我认为它看起来比:

class Zebra
{
    private Lazy<int> _StripeCount;

    public Zebra()
    {
        this._StripeCount = new Lazy(() => ExpensiveCountingMethodThatReallyOnlyNeedsToBeRunOnce());
    }

    public lazy int StripeCount
    {
        get { return this._StripeCount.Value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

第一次调用属性时,它将运行get块中的代码,然后只返回它的值.

我的问题:

  1. 将这种关键字添加到库中需要花费多少成本?
  2. 这有什么问题?
  3. 你觉得这有用吗?

我没有开始讨论如何将其纳入图书馆的下一个版本,但我很好奇这个功能需要经过什么样的考虑.

c# properties keyword

38
推荐指数
2
解决办法
1955
查看次数

逻辑AND,OR:是否保证从左到右的评估?

是否&& ||保证逻辑运算符()的从左到右的评估?

假设我有这个:

SDL_Event event;

if (SDL_PollEvent(&event)) {
    if (event.type == SDL_QUIT) {
            // do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

这保证与此相同吗?

SDL_Event event;

if (SDL_PollEvent(&event) && event.type == SDL_QUIT) {
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

这也很重要,假设我们有两个要求,a并且b.因此,要求a更有可能失败b.然后说它if (a && b)比说更有效率if (b && a).

c++ operator-precedence logical-operators

27
推荐指数
1
解决办法
1万
查看次数

放置/逐段语法是否可能出现延迟的“运算符”或“过载”?

所以我们都去过那里。我有一个不错的对象,它有一个构造函数,如果对象创建正确,则该对象可以解析为true,但是它也具有其他状态,因此我可以很高兴地编写:

if (const auto& str = std::ofstream("/tmp/myfile"))
{
  str << "Oh that was easy\n";
}
Run Code Online (Sandbox Code Playgroud)

但是我真正想做的是尝试一些替代方法:

if (const std::stream& str = (std::ofstream("/tmp/myfile") || std::ofstream("/temp/myfile") || std::ofstream("./myfile")) )
{
  str << "Oh that was not so easy\n";
}
Run Code Online (Sandbox Code Playgroud)

显然不是!我可能会打开3个文件,但是将它们强制转换为“ true”布尔值,并且当然不能强制转换为std :: stream。如果我超载operator ||了流rvals,那么它将打开所有3个文件,因为忘记了延迟评估!

我知道,std :: stream也许是一个糟糕的例子,但是20页之后,我将完成对我的选项字符串处理器的说明,因此,请坚持使用std :: stream。

我期望可能是这样的:

if (const std::stream str = (std::piecewise_construct(std::ofstream,"/tmp/myfile") || std::piecewise_construct(std::ofstream,"/temp/myfile") || std::piecewise_construct(std::ofstream,"./myfile")) )
{
  str << "Oh that maybe makes sense?\n";
}
Run Code Online (Sandbox Code Playgroud)

为此,我可能需要2个重载operator ||,一个重载两个未解决的piecewise_construct并解析左侧的重载入门,而另一个重载一个rval对象在左侧,并且仅在“失败”时评估右侧”。就像是:

template<class PC2>
std::stream operator ||(std::stream&& str, …
Run Code Online (Sandbox Code Playgroud)

c++ c++11 c++20

5
推荐指数
1
解决办法
135
查看次数

为什么(申请和'(1 2 3))不起作用,而(和1 2 3)在R5RS中有效?

我在这样的Racket中试过它

> (apply and '(1 2 3))
. and: bad syntax in: and
> (and 1 2 3)
3
Run Code Online (Sandbox Code Playgroud)

有没有人有这个想法?

lisp scheme

3
推荐指数
2
解决办法
383
查看次数

C++ 逻辑 &amp;&amp; 和 || 的短路求值 运营商

C++ 中的用户重载逻辑运算符 ( &&, ||) 的行为类似于常规函数。也就是说,bool operator&&(const T &a, const T2 &b);在进入函数之前对 in 的两个参数进行求值,因为进入函数是 C++ 中的序列点[1]。到这里一切都很好。

\n\n

现在, \xe2\x80\x9c 内置运算符 && 和 || 执行短路评估\xe2\x80\x9d [2][3],其中左侧和右侧之间有一个序列点。引用的参考文献并没有明确 \xe2\x80\x9cbuiltin\xe2\x80\x9d 是什么,只是它们接受bool操作数,或者使用 \xe2\x80\x9c 上下文转换为 bool\xe2\x80\ 将它们转换x9d。它还提到,只有 \xe2\x80\x9c 两个标准库类重载这些运算符,[因为]短路属性 (...) 不适用于重载,并且因为具有布尔语义的类型并不常见。\xe2\x80\ x9d [2]

\n\n

具有布尔语义的类型?\xe2\x80\x9c 内置运算符\xe2\x80\x9d 到底如何工作?是否根本不可能用短路求值来定义逻辑运算符?

\n\n

[1] https://en.wikipedia.org/wiki/Sequence_point

\n\n

[2] http://en.cppreference.com/w/cpp/language/operator_logic

\n\n

[3] https://en.wikipedia.org/wiki/Short- Circuit_evaluation

\n

c++ operators short-circuiting c++11

3
推荐指数
1
解决办法
1227
查看次数

在 C++ 中使用嵌套 if 语句与逻辑运算符 &amp;&amp;

假设我有一个整数数组表示棋盘上的棋子;

int board[8][8];
Run Code Online (Sandbox Code Playgroud)

在我的国际象棋游戏中,我目前正在编写一个生成器函数,它将返回所有合法移动的整数向量

当然,我将使用if 语句

我现在需要检查棋盘上的某个元素对于棋盘上的一块

例如,如果我有一个棋子;

board[row][col] == 'p';
Run Code Online (Sandbox Code Playgroud)

我需要生成[row+1][col][row+2][col]并且在某些情况下,如果它可以攻击一块,那么列中也会发生变化。

但是如果一块位于 的任何边缘boardboard[row+1][col]将返回索引超出范围

出于这个原因,我需要一个额外的 if 语句。

我的问题是,我应该使用:

if (pieceisnotonedge && board[row+1][col] == 0)
Run Code Online (Sandbox Code Playgroud)

或者

if (pieceisnotonedge)
{
    if (board[row+1][col] == 0)
}
Run Code Online (Sandbox Code Playgroud)

对于第一个示例,如果pieceisnotonedge返回false,它还会检查下一个条件吗?因为如果是这样,那我就有麻烦了。

c++ algorithm logic if-statement logical-operators

0
推荐指数
1
解决办法
462
查看次数