当前位置:  开发笔记 > 编程语言 > 正文

使用std :: function中的函数类型来声明该类型的多个函数

如何解决《使用std::function中的函数类型来声明该类型的多个函数》经验,为你挑选了2个好方法。

假设我有

typedef std::function<
    double(
        int,
        long
    )
> FooType;

我想为一系列函数声明函数原型,我可以插入到std::function这种类型的函数中.我知道我可以写

double foo1(int, long);
double foo2(int, long);

等,但有什么方法可以FooType在声明函数原型时以某种方式使用?就像是

FooType::type foo1, foo2;

也许我可能不得不使用(*foo1)或类似?自然地,在函数的实现中我需要长时间拼出它,所以我可以输入一些参数,但是如上所述写它会使我的头文件更清晰.



1> Kerrek SB..:

当然,你可以像往常一样使用部分专业化:

template  struct fn_sig;
template  struct fn_sig> { using type = T; };

用法:

fn_sig::type f;

double f(int a, long b) { return double(a) /  b; }

(您显然需要为函数定义拼写基础函数类型.)



*)这意味着对于表单的任何问题,这是相同的答案"我可以从模板specializaton获取模板参数".



2> Potatoswatte..:

如上所述写它会使我的头文件更清洁

相反,它会更清晰(更少的元编程):从foo()声明开始并FooType从中创建.

double foo(int, long);

typedef std::function< decltype(foo) > FooType;

由于可能有几个这样的函数,因此两个typedef可能是最佳因子:

typedef double FooFn(int, long);
typedef std::function< FooFn > FooType;

FooFn foo1, foo2, foo3;

当然,在实现(.cpp)文件中,签名需要手写.

还有一件事,请注意,这std::function是函数指针的重量级泛化.如果你只将普通函数分配给它,函数指针可能会更好,这将是一个替代品:

typedef FooFn * FooType;

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有