我想写这样的代码:
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块中的代码,然后只返回它的值.
我的问题:
我没有开始讨论如何将其纳入图书馆的下一个版本,但我很好奇这个功能需要经过什么样的考虑.
是否&& ||保证逻辑运算符()的从左到右的评估?
假设我有这个:
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).
所以我们都去过那里。我有一个不错的对象,它有一个构造函数,如果对象创建正确,则该对象可以解析为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) 我在这样的Racket中试过它
> (apply and '(1 2 3))
. and: bad syntax in: and
> (and 1 2 3)
3
Run Code Online (Sandbox Code Playgroud)
有没有人有这个想法?
C++ 中的用户重载逻辑运算符 ( &&, ||) 的行为类似于常规函数。也就是说,bool operator&&(const T &a, const T2 &b);在进入函数之前对 in 的两个参数进行求值,因为进入函数是 C++ 中的序列点[1]。到这里一切都很好。
现在, \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]
具有布尔语义的类型?\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\n假设我有一个整数数组表示棋盘上的棋子;
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]并且在某些情况下,如果它可以攻击一块,那么列中也会发生变化。
但是如果一块位于 的任何边缘board,board[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,它还会检查下一个条件吗?因为如果是这样,那我就有麻烦了。