是否有任何描述异常处理/错误处理设计模式的资源(Web或书籍)?
有很多关于如何编写干净代码的文献,并且有很多书籍涉及设计模式.但是,我从未见过任何设计模式,涵盖了最佳处理错误的位置和方式以及如何最好地将低级函数中出现的错误传播到抽象级别的问题.
假设我在vba中有一些带有一些r类型变量的模块Range.假设在某些时候,我在那里存储一个Range对象(例如活动单元格).现在我的问题是:r如果用户删除单元格(单元格,而不仅是其值),会发生什么?
我试图在VBA中解决这个问题,但没有成功.结果很奇怪.r不是Nothing,r报告的值是类型Range,但如果我尝试在调试器窗口中查看其属性,则每个属性的值都报告为"对象需要".
如何以编程方式确定变量r是否处于此状态?
我可以这样做而不会产生错误并捕获它吗?
不幸的是,我有点困惑constexpr,在头文件中声明的全局常量和odr.
简而言之:我们可以从这里结束
https://isocpp.org/files/papers/n4147.pdf
那
constexpr MyClass const MyClassObj () { return MyClass {}; }
constexpr char const * Hello () { return "Hello"; }
Run Code Online (Sandbox Code Playgroud)
比...好
constexpr MyClass const kMyClassObj = MyClass {};
constexpr char const * kHello = "Hello";
Run Code Online (Sandbox Code Playgroud)
如果我想"只使用"那些全局声明/定义的实体并且不想考虑我如何使用它们,那么在头文件中定义全局变量?
在C++中是否有任何技巧可以确保类的用户只能生成rvalues?
例:
struct PoorClass { /* ... */};
struct EnrichedClass {
explicit EnrichedClass (const PoorClass & poor)
: m_poor (poor)
{
}
/* additional functionality for poor objects */
private:
const PoorClass & m_poor;
}
const EnrichedClass asEnriched (const PoorClass & poor)
{
return EnrichedClass { poor };
}
Run Code Online (Sandbox Code Playgroud)
现在,丰富的物体应该只是暂时的,因为它们不应该在被包裹的不良物体中存活.理想情况下,富集对象不应该存储在变量中,而只能作为对函数的右值引用传递.
有没有办法确保,即尽可能使其成为自动防故障?
考虑以下程序:
#include <iostream>
struct X {
X () = default;
X (X &) { std::cout << "non-const called" << std::endl; }
X (X const &) { std::cout << "const called" << std::endl; }
int i () const { return 7; }
};
auto f () {
X x;
auto lambda = [=]() { return x.i(); };
return lambda;
}
int main()
{
auto lambda = f();
std::cout << lambda () << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用VC++ 15,我得到了输出
const called
const …Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的问题:某个地方有一个功能
int size (const C & c)
Run Code Online (Sandbox Code Playgroud)
至少可以通过参数依赖的名称查找找到它.现在的问题是:
struct B
{
int size () { /* ... */ }
void doSomething (const C & c)
{
int x = size (c); // <----------- problem!
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为名称查找在找到成员函数后停止.
我必须在指示的行中写什么,以便不会尝试调用成员函数,但是,如果成员函数不存在,编译器会做什么呢?
请注意,解决方案不是写入::size,因为这会阻止依赖于参数的名称查找,并且只有在我知道size声明的位置时才有效.
进一步复杂化:
我知道对于T我使用下面模板化成员函数的每个相关类型B::doSomething,某处会有一个函数
int size (const T & t)
Run Code Online (Sandbox Code Playgroud)
至少可以通过参数依赖的名称查找找到它.B看起来如下:
struct B
{
int size () { /* ... */ }
template<class T>
void …Run Code Online (Sandbox Code Playgroud) 考虑到(x | r | l | pr | gl)值,我想到了以下问题:
考虑以下两个变量声明:
X x = ...;
Run Code Online (Sandbox Code Playgroud)
和
X&& x = ...;
Run Code Online (Sandbox Code Playgroud)
并承担了...做不提供的x值.
任何人都可以想到代码没有使用decltype,这会产生什么影响?在这两种情况下,(x)都会通过左值型X,不是吗?
可能我不是第一个发现std::exception_ptr可以用来实现any类型的人(性能考虑被放在一边),因为它可能是C++中唯一可以容纳任何东西的类型.然而,谷歌搜索没有带来任何这方面的结果.
有没有人知道以下方法是否曾用于任何有用的方法?
#include <exception>
#include <iostream>
struct WrongTypeError : std::exception { };
class Any {
public:
template <class T>
void set (T t) {
try { throw t; }
catch (...) { m_contained = std::current_exception(); }
}
template <class T>
T const & get () {
try { std::rethrow_exception (m_contained); }
catch (T const & t) { return t; }
catch (...) { throw WrongTypeError {}; }
}
private:
std::exception_ptr m_contained = nullptr;
};
int main …Run Code Online (Sandbox Code Playgroud) 有人知道如何编写一个在PLINQ中返回ParallelQuery的扩展函数吗?
更具体地说,我有以下问题:我想在需要引擎的PLINQ查询中执行转换,该引擎的创建成本高且无法同时访问.
我可以做以下事情:
var result = source.AsParallel ().Select ( (i) => { var e = new Engine (); return e.Process(i); } )
Run Code Online (Sandbox Code Playgroud)
这里,每个项目创建一次引擎,这太昂贵了.
我希望每个线程创建一次引擎.
使用Aggregate,我可以接近我想要的东西
// helper class: engine to use plus list of results obtained in thread so far
class EngineAndResults {
public Engine engine = null;
public IEnumerable<ResultType> results;
}
var result = source.AsParallel ().Aggregate (
// done once per block of items (=thread),
// returning an empty list, but a new engine
() => new …Run Code Online (Sandbox Code Playgroud) 突然之间,Visual Studio 2010已经停止了以下行为:
我有一个包含几个项目的解决方案:类库项目,应用程序项目和测试项目.
Application项目设置为默认启动项目.
现在,如果我更改了类库中的任何内容并按F5,则Visual Studio不再重建类库,因此它会运行过时的代码.
与Test项目相同的行为.
我究竟做错了什么?我很确定这种行为是新的,但我不知道我改变了什么.