在C ++中为函数类型声明类型别名时,被认为是最佳或良好的做法(我知道这部分问题可能是主观的)?
using FuncType = void(int, int);
或
using FuncType = std::function<void(int, int)>;
一方面有好处吗?
我应该如何将这些类型用作函数参数(作为functor,lambda,member或global函数传递时),例如
void foo(FuncType&& func) { ... }
void foo(FuncType func) { ... }
void foo(std::function<FuncType> func) { ... }
修改
我知道上面的所有例子都不适用于#1和#2,但这不是重点。我想知道哪个(以及为什么)选项更好,以及在将它用作函数参数时应该如何传递此类型。
由于它看起来过于宽泛(我完全理解),我将详细介绍我的具体案例。
我有一个类,它包含我想调用的函数向量(很可能是并行的,但我认为这不重要)。在这个类中,我可以在运行时向向量添加函数。
例如:
类
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;
}
我应该如何定义FuncType
和addFunction
的参数以及如何将它们存储在向量中(在最好的情况下,不复制可调用对象)?
答案 0 :(得分:0)
我个人使用:
typedef std::function<void(int,int)> FuncType;
和
void foo(const FuncType &func) { ... }
编辑: 考虑到对此帖的评论,因为它需要虚拟调度,因此不是性能最佳。