Перейти к содержанию

Последнее обновление:2026-10-12

C++ подробный разбор std::function

Недавно, пишу код на C++, я воспользовался is_function и заодно взглянул на реализацию в исходниках — и обнаружил некоторые вещи: раньше мы изучали три точки ..., а что такое шесть точек ...... вы знаете?

Аналогично, если есть такой код:

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

знаете ли вы, что он означает?

Давайте вместе разберёмся в деталях!

1.Шесть точек

Шесть точек обычно называют two ellipsis operators; их можно разбить на части и получить три следующих случая

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

Теперь всё наглядно; взглянем на код std::is_function.

2.Детали реализации is_function

Реализация std::is_function включает главный шаблон и две частичные специализации:

// 主模板,假设提供的类型不是函数类型
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 {};
  • Главный шаблон предполагает, что предоставленный тип не является типом функции, и возвращает std::false_type.
  • Первая частичная специализация предназначена для обычных типов функций, где Ret обозначает возвращаемый тип, а Args... — типы параметров. Если предоставленный тип соответствует такой сигнатуре функции, результатом будет std::true_type.
  • Вторая частичная специализация предназначена для типов функций с переменным числом аргументов, где многоточие означает, что функция принимает переменное количество параметров. Аналогично, если предоставленный тип соответствует такой сигнатуре функции, результатом будет std::true_type.

3.Пример использования

Напоследок приведу пример использования 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;
}

Это выведет:

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

Ну как, разобрались? На этом раздел окончен~

Похожие темы

Комментарии