我理解为什么我们需要decltype(auto)
以及它与auto
的区别,但是我不知道为什么以及何时应该/需要使用decltype(expression)
。 在cppreference上的所有示例中,我可以只使用decltype(auto),我检查了它。 提前感谢你的帮助。
有时,您需要声明一个与另一个类型相关的类型,但又希望保持它的不可知论性:
struct foo
{
std::vector<int> data;
decltype(data)::iterator it;
};
但我无法知道为什么和何时应该/需要使用decltype(expression)
在C++11中,您可以使用尾随返回类型,但不能使用自动推导的返回类型。 例如:
template<typename T, typename U>
auto add(T t, U u) -> decltype(t + u) { return t + u; }
C++14等价物为:
template<typename T, typename U>
decltype(auto) add(T t, U u) { return t + u; }
另一个用途是SFINAE,例如检测具有特定名称的成员函数的存在:
#include <iostream>
template<class T>
auto test_has_f(T* p) -> decltype(static_cast<void>(p->f()), std::true_type{}); // Cast to void to avoid user-defined operator,(), if any.
std::false_type test_has_f(void*);
template<class T>
using HasF = decltype(test_has_f(static_cast<T*>(0)));
struct A {};
struct B { void f(); };
int main() {
std::cout << HasF<A>::value << '\n'; // Outputs 0.
std::cout << HasF<B>::value << '\n'; // Outputs 1.
}
我能想到的最简单的例子是:
void foo(int i) {
for (decltype(i) j = 0; j < i; ++j)
...
}
在这里,索引j
自动具有与上限i
相同的类型。
lambda表达式提供了另一个示例:
[](auto i) {
for (decltype(i) j = 0; j < i; ++j)
...
}
问题内容: 我知道他们两个都禁用了Nagle的算法。 我什么时候应该/不应该使用它们中的每一个? 问题答案: 首先,不是所有人都禁用Nagle的算法。 Nagle的算法用于减少有线中更多的小型网络数据包。该算法是:如果数据小于限制(通常是MSS),请等待直到收到先前发送的数据包的ACK,同时累积用户的数据。然后发送累积的数据。 这将对telnet等应用程序有所帮助。但是,在发送流数据时,等待A
问题内容: 在该类中,有两个字符串,和。 有什么不同?我什么时候应该使用另一个? 问题答案: 如果你的意思是和则: 用于在文件路径列表中分隔各个文件路径。考虑在上的环境变量。您使用a分隔文件路径,因此在上将是;。 是或用于拆分到特定文件的路径。例如在上,或
问题内容: 在集成我以前从未使用过的Django应用程序时,我发现了用于定义类中函数的两种不同方式。作者似乎非常有意地使用了它们。第一个是我自己经常使用的: 另一个是我不使用的,主要是因为我不知道何时使用它,以及什么用途: 在Python文档中,装饰器的解释如下: 类方法将类作为隐式第一个参数接收,就像实例方法接收实例一样。 所以我想指的是自己(而不是实例)。我不完全理解为什么会这样,因为我总是可
问题内容: 我看过各种文章,但我仍然不知道为什么不应该使用它。请让我知道您的想法。 问题答案: 我发现有必要在错误的设计中使用instanceof提示。可以肯定的是,将会出现一个大型,复杂的开关风格的构造。在我看到的其他大多数情况下,我们应该使用多态而不是instanceof。请参阅策略模式。(相关的使用示例) 我唯一需要使用的是实现时。
问题内容: 我在阅读《 Swift编程语言》指南 时遇到了一个叫做的函数,但我仍然想知道为什么以及何时需要实现它,因为我们实际上不需要管理内存。 问题答案: 不需要实现该方法,但是如果需要在取消分配对象之前进行一些操作或清理,则可以使用它。 在苹果的文档包括例如: 因此,无论何时将玩家从游戏中移除,其硬币都会退还至银行。
问题内容: 在Java中,有更好的解决方案。那我什么时候应该使用?这是多余的吗? 这两者之间的多线程方面是否常见? 问题答案: 这两个类在某些方面有所不同。 ConcurrentHashMap不保证*其合同约定的运行时间。它还允许调整某些负载因子(大约是同时修改它的线程数)。 另一方面,ConcurrentSkipListMap可确保各种操作的平均O(log(n))性能。它也不支持为了并发而进行调
问题内容: 如果我理解AccessController.doPrivileged正确,它是说,不可信代码应能够调用要求的权限(例如,方法)通过一个中间方法 确实 有权限。 这就提出了一个问题:什么时候应该使用?什么时候应该允许不可信代码通过中间方法调用特权代码?什么时候应该失败? 按照您的推理,请解释为什么应始终允许创建ClassLoader:http : //findbugs.sourcefor
我刚刚在使用及其方法时遇到了一个问题。虽然我知道如何使用它们,但我不太确定何时使用它们。 例如,我有一个列表,包含到不同位置的各种路径。现在,我想检查一个给定的路径是否包含列表中指定的任何路径。我想根据是否满足条件返回。 当然,这本身并不是一项艰巨的任务。但是我想知道我是应该使用流还是使用for(-each)循环。 列表 示例-流 示例For-Each循环 请注意,参数始终是小写的。 我的第一个猜