递归 std::functional 与递归匿名命名空间函数。使用哪一个?
Recursive std::functional vs recursive anonymous namespace function. Which one to use?
假设我的 class 有一个方法必须从其中调用其他递归方法。
我的 .h 文件如下所示:
class MyClass()
{
public:
void foo();
};
我的问题是,这些实现中哪个更好(忽略无限循环):
namespace
{
void myRecursiveFunction()
{
myRecursiveFunction();
}
}
void MyClass::foo()
{
myRecursiveFunction();
}
或
void MyClass::foo()
{
std::function<void()> myRecursiveFunction =
[&] ()
{
myRecursiveFunction();
};
myRecursiveFunction();
}
,给出 myRecursiveFunction()
只会从 foo()
?
调用
当然,在现实世界中myRecursiveFunction()
做某事。我只是不想用不需要的信息填充代码。
如果我只在一种方法中使用它,我所有的 class 都可以访问 myRecursiveFunction
吗?
是的,可以在匿名命名空间中定义 myRecursiveFunction()
,即使它对所有 class' 实现可见,即使只有 MyClass::foo()
调用它。
据推测,您可以控制 class 实施,并且不会在没有理由的情况下调用 myRecursiveFunction()
。这适用于所有功能:您会在不应该调用的地方调用 abort()
吗?尽管您的整个 class.
都可以访问它
使用递归本地 lambda 只会增加一层推理,并使代码更难阅读。如果这是你程序的时间关键部分,你可能会通过使用 std::function
.
来降低它的速度
std::function
优点:
- 如果仅从该函数调用递归函数,那么它的作用域就会受到很好的限制。匿名命名空间对整个翻译单元可见。该功能对翻译单元的其余部分可见是可以的,因此可以说这只是一个微小的优势。
std::function
缺点:
- 简单函数的语法比 lambda 更简单。
std::function
可能会有 some small overhead.
- 如果你在
foo
里面定义了std::function
,那么递归函数在它外面是不可重用的。这很好,如果它无论如何都不可重复使用。
- 不适用于 c++11 之前的标准。
哪个更好取决于你需要什么和你喜欢什么。在大多数情况下,我更喜欢简单的功能。
假设我的 class 有一个方法必须从其中调用其他递归方法。
我的 .h 文件如下所示:
class MyClass()
{
public:
void foo();
};
我的问题是,这些实现中哪个更好(忽略无限循环):
namespace
{
void myRecursiveFunction()
{
myRecursiveFunction();
}
}
void MyClass::foo()
{
myRecursiveFunction();
}
或
void MyClass::foo()
{
std::function<void()> myRecursiveFunction =
[&] ()
{
myRecursiveFunction();
};
myRecursiveFunction();
}
,给出 myRecursiveFunction()
只会从 foo()
?
当然,在现实世界中myRecursiveFunction()
做某事。我只是不想用不需要的信息填充代码。
如果我只在一种方法中使用它,我所有的 class 都可以访问 myRecursiveFunction
吗?
是的,可以在匿名命名空间中定义 myRecursiveFunction()
,即使它对所有 class' 实现可见,即使只有 MyClass::foo()
调用它。
据推测,您可以控制 class 实施,并且不会在没有理由的情况下调用 myRecursiveFunction()
。这适用于所有功能:您会在不应该调用的地方调用 abort()
吗?尽管您的整个 class.
使用递归本地 lambda 只会增加一层推理,并使代码更难阅读。如果这是你程序的时间关键部分,你可能会通过使用 std::function
.
std::function
优点:
- 如果仅从该函数调用递归函数,那么它的作用域就会受到很好的限制。匿名命名空间对整个翻译单元可见。该功能对翻译单元的其余部分可见是可以的,因此可以说这只是一个微小的优势。
std::function
缺点:
- 简单函数的语法比 lambda 更简单。
std::function
可能会有 some small overhead.- 如果你在
foo
里面定义了std::function
,那么递归函数在它外面是不可重用的。这很好,如果它无论如何都不可重复使用。 - 不适用于 c++11 之前的标准。
哪个更好取决于你需要什么和你喜欢什么。在大多数情况下,我更喜欢简单的功能。