参考重载函数(或过程)

时间:2018-01-20 13:28:03

标签: delphi anonymous-function overloading typechecking

我使用的是

类型
/**
 * @ORM\Entity
 * @ORM\Table(name="product")
 * @ORM\Entity(repositoryClass="App\Repository\ProductRepository")
 * @ApiResource(attributes={"pagination_client_items_per_page"=true,
 *                          "filters"={"product.search"}
 *                         },
 *              collectionOperations={
 *                      "get"={
 *                          "method"="GET",
 *                          "normalization_context"={"groups"={"product_gets"}} },
 *                      "post"={
 *                          "method"="POST",
 *                          "denormalization_context"={"groups"={"product_post"}} },
 *                      "product_slug"={
 *                          "route_name"="api_product_slug",
 *                          "swagger_context" = {
 *                              "parameters" = {
 *                                  {
 *                                  "name" = "slug",
 *                                  "in" = "path",
 *                                  "required" = "true",
 *                                  "type" = "string"
 *                                  }
 *                              },
 *                              "responses" = {
 *                                  "200"={
 *                                      "description"="Product found"
 *                                  },
 *                                  "404"={
 *                                      "description"="Product not found"
 *                                  }
 *                              },
 *                              "summary"="Returns a Product resource for a given slug",
 *                          }
 *                       }
 *              },
 *              itemOperations={
 *                      "get"={
 *                          "method"="GET",
 *                          "normalization_context"={"groups"={"product_get"}} },
 *                      "put"={
 *                          "method"="PUT",
 *                          "denormalization_context"={"groups"={"product_put"}} },
 *                      "delete"={
 *                          "method"="DELETE"}
 *              })
 * @ORM\HasLifecycleCallbacks()
 */

我的代码很多。假设我有一个变量

type
  TRealFunction = reference to function(const X: extended): extended;

并尝试将var rfcn: TRealFunction; 分配给它:

Math.ArcSec

这与Delphi 2009中的预期一样,但现在我尝试在Delphi 10.2中编译它,编译器感到不安:

rfcn := ArcSec;

似乎差异在于[dcc32 Error] Unit1.pas(42): E2010 Incompatible types: 'TRealFunction' and 'ArcSec' 在Delphi 10.2中被重载:它有ArcSecsingledouble种类。似乎编译器不喜欢引用这种类型的重载函数(或过程)(太相似的类型?)。

但是,如果我重新定义

extended

它编译得很好。

当然,这里有明显的解决方法:我可以定义

type
  TRealFunction = function(const X: extended): extended;

或者我可以写

function ArcSec(const X: extended): extended; inline;
begin
  result := Math.ArcSec(X);
end;

尽管如此,这仍然需要编写很多代码。是否有更简单的解决方法?

1 个答案:

答案 0 :(得分:4)

这有效:

type
  TRealFunction = function(const X: extended): extended;
const
  rc : TRealFunction = Math.ArcSec;
type
  TRealFunctionRef = reference to function(const X: Extended) : Extended;

var
  rfcn: TRealFunctionRef;
begin
  rfcn := rc;
  ...

它需要额外的类型声明,但也许值得付出努力。