Última atualização:2026-10-12
std::function em C++ explicado em detalhes¶
Recentemente, ao escrever código C++, usei is_function e, de passagem, olhei a implementação no código-fonte e descobri alguns problemas. O que aprendemos antes foram três pontos ..., mas você sabe o que são seis pontos ......?
Da mesma forma, se houver um código assim:
Você sabe o que ele significa?
Vamos mergulhar nos detalhes juntos!
1.Seis pontos¶
Os seis pontos costumam ser chamados de two ellipsis operators; podemos dividi-los em três casos:
template <typename... Args> void foo1(Args......)
template <typename... Args> void foo2(Args... ...)
template <typename... Args> void foo3(Args..., ...)
Agora fica claro. Vejamos o código de std::is_function.
2.Detalhes da implementação de is_function¶
A implementação de std::is_function envolve o template primário e duas especializações parciais:
// 主模板,假设提供的类型不是函数类型
template<typename T>
struct is_function : std::false_type {};
// 偏特化,用于正常的函数类型
template<typename Ret, typename... Args>
struct is_function<Ret(Args...)> : std::true_type {};
// 偏特化,用于变参函数类型
template<typename Ret, typename... Args>
struct is_function<Ret(Args......)> : std::true_type {};
- O template primário assume que o tipo fornecido não é um tipo de função e produz
std::false_typecomo resultado. - A primeira especialização parcial é usada para tipos de função normais, em que
Retrepresenta o tipo de retorno eArgs...os tipos dos parâmetros. Se o tipo fornecido corresponder a essa assinatura de função,std::true_typeé o resultado. - A segunda especialização parcial é usada para tipos de função variádicos, em que as reticências indicam que a função aceita um número variável de parâmetros. Da mesma forma, se o tipo fornecido corresponder a essa assinatura de função,
std::true_typeé o resultado.
3.Exemplo de uso¶
Por fim, um exemplo de uso de std::is_function:
#include <iostream>
#include <type_traits>
int func(int x, int y) { return x + y; }
int vararg_func(int x, ...) { return x; }
int main() {
std::cout << std::boolalpha;
std::cout << "Is func a function? " << std::is_function<decltype(func)>::value << std::endl;
std::cout << "Is vararg_func a function? " << std::is_function<decltype(vararg_func)>::value << std::endl;
return 0;
}
Isso produzirá:
Ficou claro? Fim desta seção~
Tópicos relacionados¶
- Funções virtuais puras e classes abstratas em C++ | C++那些事
- Asserções com assert em C++ | C++那些事
- Bit fields em C++ | C++那些事
- Implementando polimorfismo de C++ em linguagem C | C++那些事
- Constantes e modificadores com const em C++ | C++那些事
- A família completa do const em C++ | C++那些事
- O operador de desreferência * em C++ | C++那些事
- Inicialização e atribuição em C++ | C++那些事
- Formas de retornar múltiplos valores em C++ | C++那些事
- A palavra-chave mutable em C++ | C++那些事