Ich frage mich, was ist der Unterschied zwischen der Verwendung von std::enable_if
als Funktionsargument vs Vorlage Argument?Was ist der Unterschied zwischen der Verwendung von std :: enable_if als Funktionsargument gegen Vorlage Argument?
Ich habe folgende 2 Funktionsschablonen:
#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);
}
die die folgende Anordnung erzeugen (wie von 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
Neben dem offensichtlichen Unterschied, dass f_function
2 Funktionsparameter und f_template
mit 2 Vorlagenargumenten Was sind die Unterschiede zwischen ihnen? Gibt es einen bestimmten Gebrauch von einem über einen anderen?
Sie könnten es sogar zum Rückgabetyp hinzufügen. Abgesehen von dem Stack, der für Ihre erste Version (f_function) benötigt wird, verhalten sich diese ziemlich gleich. – lorro