使用std :: enable_if作为函数参数与模板参数有什么区别?
What is the difference between using std::enable_if as function argument vs template argument?
我想知道使用 std::enable_if
作为函数参数与模板参数有什么区别?
i具有以下2个函数模板:
#include <type_traits>
template<typename T>
void f_function(T, typename std::enable_if_t<std::is_pod<T>::value, int> = 0)
{
}
template<typename T, typename = typename std::enable_if_t<std::is_pod<T>::value>>
void f_template(T)
{
}
int main()
{
int x = 1;
f_function(x);
f_template(x);
}
产生以下组件(如https://godbolt.org/g/on4rya):
main:
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp
movl $1, -4(%rbp)
movl -4(%rbp), %eax
movl $0, %esi
movl %eax, %edi
call void f_function<int>(int, std::enable_if<std::is_pod<int>::value, int>::type)
movl -4(%rbp), %eax
movl %eax, %edi
call void f_template<int, void>(int)
movl $0, %eax
leave
ret
void f_function<int>(int, std::enable_if<std::is_pod<int>::value, int>::type):
pushq %rbp
movq %rsp, %rbp
movl %edi, -4(%rbp)
movl %esi, -8(%rbp)
nop
popq %rbp
ret
void f_template<int, void>(int):
pushq %rbp
movq %rsp, %rbp
movl %edi, -4(%rbp)
nop
popq %rbp
ret
除了明显的区别外,f_function
具有2个函数参数和f_template
具有2个模板参数,它们之间有什么区别?一个人有任何特殊用途吗?
作为琐碎的例子,您可以做到这一点:
int main() {
// f_function(std::string{}); // (1)
// f_template<std::string>(std::string{}); // (2)
f_template<std::string, void>(std::string{});
}
而(1)和(2) 没有出于明显的原因(std::string
不是接受类型),即使T
,f_template
也可以与技巧一起使用不是POD类型。
有效的选择是:
template<typename T, std::enable_if_t<std::is_pod<T>::value>* = nullptr>
void f_template(T)
{ }
另一个可能是:
template<typename T>
std::enable_if_t<std::is_pod<T>::value>
f_template(T)
{ }
涉及参数包作为后卫的更晦涩的
:
template<typename T, typename..., typename = typename std::enable_if_t<std::is_pod<T>::value>>
void f_template(T)
{ }
所有这些都按预期工作,您无法围绕它们工作(至少,我不知道该怎么做,但是也许有人会带来一个很好的技巧)。
相关文章:
- 传递给std::function template的template参数究竟代表什么
- 什么..(省略号)作为函数原型中唯一的函数参数,C++?
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 未命名的非类型模板参数有什么意义?
- 有什么方法可以将具有不同模板参数的模板类实例放入向量中?
- 什么是仅调用一次并调用参数的控制台应用
- 在模板参数中使用 {} 在 type_trait{} 中时,其作用是什么<T>?
- 在 C 和 C++ 中作为函数参数,int **a 和 int a[][] 之间有什么确切的区别
- 为什么或在什么情况下,你会将参数作为C++中的引用(或指针)传递给函数?
- 没有大小参数的CString::GetBuffer()做什么
- 可变参数模板和省略号有什么区别?
- 当通知迭代器参数初始化为空列表的开头时,list::insert 行为是什么?
- C++ [错误] 声明'char '隐藏参数。什么意思?
- 用相同的参数声明两个构造函数的最偶像化的方法是什么?
- 使用作为参数返回的指针的最佳做法是什么
- C++构造函数调用 boost::文件系统::p ath 作为参数 - 什么也没发生
- 如果我只想指定哈希函数,我应该传递给unordered_map的存储桶计数参数什么?