Ir para o conteúdo

Ú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:

template<typename... Args>
struct foo(Args......);

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_type como resultado.
  • A primeira especialização parcial é usada para tipos de função normais, em que Ret representa o tipo de retorno e Args... 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á:

Is func a function? true
Is vararg_func a function? true

Ficou claro? Fim desta seção~

Tópicos relacionados

Comentários