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

Mic*_*ock 15 c++ c++11

假设我有

typedef std::function<
    double(
        int,
        long
    )
> FooType;
Run Code Online (Sandbox Code Playgroud)

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

double foo1(int, long);
double foo2(int, long);
Run Code Online (Sandbox Code Playgroud)

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

FooType::type foo1, foo2;

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

Ker*_* SB 18

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

template <typename> struct fn_sig;
template <typename T> struct fn_sig<std::function<T>> { using type = T; };
Run Code Online (Sandbox Code Playgroud)

用法:

fn_sig<FooType>::type f;

double f(int a, long b) { return double(a) /  b; }
Run Code Online (Sandbox Code Playgroud)

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



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


Pot*_*ter 9

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

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

double foo(int, long);

typedef std::function< decltype(foo) > FooType;
Run Code Online (Sandbox Code Playgroud)

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

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

FooFn foo1, foo2, foo3;
Run Code Online (Sandbox Code Playgroud)

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

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

typedef FooFn * FooType;
Run Code Online (Sandbox Code Playgroud)