在声明部分中实例化对象期间可能会引发异常。
例如,以下代码由于(有意的)堆栈溢出而引发了Storage_Error异常。
如何捕获此异常?
(我尝试将异常处理放入实例化的对象主体以及实例化该过程的过程中,未能捕获实例化期间引发的异常。)
谢谢!
---------------------- foo.ads -----------------------
generic
Size : Natural;
package Foo is
type Integer_Array is Array (1..Size) of Integer;
buffer : Integer_Array;
end Foo;
---------------------- foo.adb -----------------------
With Text_IO; use Text_IO;
package body Foo is
begin
exception -- Failed attempt
when storage_error =>
Put_line("Foo: Storage Error");
when others =>
Put_line("Foo: Other Error");
end Foo;
---------------------- bar.adb -----------------------
with Text_IO; use Text_IO;
With Foo;
procedure Bar is
package object is new Foo (Size => 10_000_000);
begin
Put_line("Dummy Statement"); …Run Code Online (Sandbox Code Playgroud) 当写入H~2~Oasciidoc 文档的文本时,它被呈现为“H subscript(2) O”,但是尝试定义一个属性::water: H~2~O并引用文本中的属性,因为它被or{water}的逐字定义替换。(不处理下标格式)。问题是:我可以用文本格式定义属性吗?(例如,解决方法是使用“sed”,但如果可能的话,在 asciidoc 中执行会更优雅)。:water:H~2~O
例如,我可以有如下声明:
A = B *<5> C;
Run Code Online (Sandbox Code Playgroud)
其中5是一个参数(可以提供上下文),*是重载运算符,而operator *使用给定的参数。
例如,下面列出了A NON-WORKING且意义不大(仅表示重点)。
(这当然是可能的,如果我们定义了一个新的功能MUL io的重载现有的运算符*)。
struct myClass {
int val = 0;
myClass (int x) {
val = x;
}
template<int s> myClass operator* (myClass x) {
return val * x.val + s;
};
};
int main()
{
myClass a(10), b(3);
myClass c = a *<5> b;
}
Run Code Online (Sandbox Code Playgroud)
====编辑====
我想增加一些动机,希望能更好地解释这个问题:
通常,元编程提供了一种扩展语言的方式。当编译器看到表达式C = A * B时,它当然知道A和B,但是它也知道结果的去向,在这种情况下为C,并且可以根据此知识采取行动以提供更好的代码。
当运算符重载时,我们只有A,B-提供有关结果的一些信息,例如,在某些情况下C的类型可以提供更好的优化,而对于我的原始情况,可以避免完全错误的结果。
想要** 5之类的原因是该参数可以设置为可选参数,并且仅在需要时使用,而在不需要时才使用-这是正常的*。
使用:c = a.operator * b; 如以下建议工作并解决了问题。