函数模板的这两种定义有什么区别?
What's the difference between these two definitions of function templates?
template <typename Func, typename... Args>
static void WraperFunc(Func func, Args &&... args) {
SomeFunc(func, args...);
}
和
template <typename Func, typename... Args>
static void WraperFunc(Func func, Args ... args) {
SomeFunc(func, args...);
}
哪个更好,更推荐?还是有比两者都更好的选择?
Args &&
将通过引用接受左值和右值,并在保持其原始值类别的情况下转发它们。我喜欢那个版本(并使用std::forward
)。
template <typename Func, typename... Args>
static void WraperFunc(Func func, Args &&... args) {
SomeFunc(func, std::forward<Args>(args)...);
// ^^^^^^^^^^^^ Use of forward
}
注意std::forward
的习惯用法,它不包括Args&&
的&&
。
关于std::forward
和引用崩溃的机制和使用有很多文章,这里和Scott Meyers关于"转发(或通用)引用"的经典。
第一个,但是您需要在扩展期间通过使用std::forward<T>
转发您的参数。这允许在正确推导参数时扩展参数包。
template <typename Func, typename... Args>
static void WraperFunc(Func func, Args &&... args)
{
// note that we use std::forward<Args>( args )... to perfect forward our arguments
SomeFunc(func, std::forward<Args>( args )...);
}
作为一个例子,假设你有一个函数声明如下:
template <typename T>
void some_func( T& ) {}
尝试使用临时值或右值来使用上述函数将失败:
some_func( 5 );
这是因为5是一个常量,不能赋值给int&
。
假设您使用以下参数调用函数:
void (*foo)(int, char, float) = /* ... */;
const int i = 0;
char j;
WraperFunc(foo, i, j, 0.42);
在第一种情况下,它相当于调用这个函数:
void WraperFunc(void (*foo)(int, char, float), int i, char c, float j) { /* ... */ }
在第二种情况下,它相当于调用这个函数:
void WraperFunc(void (*foo)(int, char, float), const int& i, char& c, float&& j) { /* ... */ }
如果您想在避免复制的同时转发参数(但这时请使用std::forward
!)
相关文章:
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- ascii 和 unicode 在处理级别有什么区别吗?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 这两种C++语法之间有什么区别?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- std::enable_if 和 std::enable_if_t 有什么区别?