Saltar a contenido

Última actualización:2026-10-12

std::function en C++ explicado en detalle

Hace poco, escribiendo código C++, usé is_function y aproveché para echar un vistazo a la implementación en el código fuente; descubrí algunas cosas. Antes aprendimos que eran tres puntos ..., pero ¿sabes qué son seis puntos ......?

Del mismo modo, si hay un fragmento de código como este:

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

¿Sabes qué significa?

¡Vamos a profundizar en los detalles juntos!

1. Los seis puntos

A los seis puntos solemos llamarlos two ellipsis operators; podemos dividirlos, y así obtenemos los tres casos siguientes

template <typename... Args> void foo1(Args......)
template <typename... Args> void foo2(Args... ...)
template <typename... Args> void foo3(Args..., ...)

Ahora está más claro; veamos el código de std::is_function.

2. Detalles de implementación de is_function

La implementación de std::is_function implica una plantilla principal y dos especializaciones parciales:

// 主模板,假设提供的类型不是函数类型
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 {};
  • La plantilla principal asume que el tipo proporcionado no es un tipo función y devuelve std::false_type como resultado.
  • La primera especialización parcial es para tipos función normales, donde Ret representa el tipo de retorno y Args... los tipos de los parámetros. Si el tipo proporcionado coincide con esa firma de función, std::true_type es el resultado.
  • La segunda especialización parcial es para tipos función variádicos, donde los puntos suspensivos indican que la función acepta un número variable de parámetros. Igualmente, si el tipo proporcionado coincide con esa firma de función, std::true_type es el resultado.

3. Ejemplo de uso

Para terminar, un ejemplo 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;
}

Esto imprimirá:

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

¿Lo has aprendido? Fin de esta sección~

Temas relacionados

Comentarios