C++;最佳实践-函数类型别名std::function<;T>;或T < >在C++中声明函数类型的类型别名时,什么是最好的或好的实践(我知道问题的这一部分可能是主观的)?或者

C++;最佳实践-函数类型别名std::function<;T>;或T < >在C++中声明函数类型的类型别名时,什么是最好的或好的实践(我知道问题的这一部分可能是主观的)?或者,c++,C++,或 使用FuncType=std::function; 一个比另一个有好处吗 例如,我应该如何使用这些类型作为函数参数(当作为functor、lambda、member或global函数传递时) void foo(FuncType&& func) { ... } void foo(FuncType func) { ... } void foo(std::function<FuncType> func) { ... } void foo(FuncType&&func

使用FuncType=std::function;
一个比另一个有好处吗

例如,我应该如何使用这些类型作为函数参数(当作为functor、lambda、member或global函数传递时)

void foo(FuncType&& func) { ... }
void foo(FuncType func) { ... }
void foo(std::function<FuncType> func) { ... }
void foo(FuncType&&func){…}
void foo(FuncType func){…}
void foo(std::function func){…}
编辑

我知道我上面的例子并不都适用于#1和#2,但这不是重点。我想知道哪个(以及为什么)选项更好,以及在将其用作函数参数时应如何传递此类型

特定用例 因为它看起来太宽泛了(我完全理解),我将给出关于我的具体案例的更多细节

我有一个类,它包含我想要调用的函数向量(很可能是并行的,但我认为这不重要)。在这个类中,我可以在运行时向向量添加函数

例如:

阶级

容器
{
公众:
使用FuncType=std::function;
内联void addFunction(FuncType func)
{
_功能推回(func);
}
内联void调用(const SomeComplexDataType&a、int b、double c)
{
用于(自动和函数:_funcs)
func(a,b,c);
}
私人:
std::向量_funcs{};
};
结构重锤
{
//包含一些重物
void运算符()
{
/*一些繁重的工作*/
}
};
int main()
{
容器c;
c、 addFunction([](const SomeComplexDataType&a,int b,double c){/*做一些轻量级的事情*/});
c、 addFunction(重功能);
c、 调用(x,y,z);
返回0;
}
我应该如何定义
FuncType
addFunction
的参数,以及如何将它们存储在向量中(在最佳情况下,不复制可调用项)?

我个人会使用:

typedef std::function<void(int,int)> FuncType;
编辑:
考虑到对这篇文章的评论,这不是最好的性能,因为它需要虚拟分派。

只有第一个选项适用于您的三个示例……如果您想编写这样的函数,请直接使用模板参数
std::function
有很大的开销。Second根本不是函数类型的别名。它是模板类专门化的别名。问题是这些都不是替代品。像椅子和桌子一样,两者都是家具,但使用方式不同。Timo,请参阅我的文章:“用户和性能的简易性”-您不会因此获得性能1)
std::function
需要虚拟调度其呼叫操作员,这可能会增加(重要)如果您需要频繁调用函数,则会增加开销;2)您正在复制
func
,其中可能包含大量要复制的functor,如果您不打算存储
func
void foo(FuncType&& func) { ... }
void foo(FuncType func) { ... }
void foo(std::function<FuncType> func) { ... }
Container
{
public:
    using FuncType = std::function<void(const SomeComplexDataType&, int, double)>;

    inline void addFunction(FuncType func)
    {
        _funcs.push_back(func);
    }

    inline void call(const SomeComplexDataType& a, int b, double c)
    {
        for (auto& func : _funcs)
            func(a, b, c);
    }

private:
    std::vector<FuncType> _funcs{};
};

struct HeavyFunctor
{
    // contains some heavy objects    

    void operator()(const SomeComplexDataType& a, int b, double c)
    {
        /* Some heavy workload */
    }
};

int main()
{
    Container c;    
    c.addFunction([](const SomeComplexDataType& a, int b, double c) { /* do something lightweight */ });
    c.addFunction(HeavyFunctor);
    c.call(x, y, z);

    return 0;
}
typedef std::function<void(int,int)> FuncType;
void foo(const FuncType &func) { ... }