Как получить тип возвращаемого значения функции
Перейти к содержимому

Как получить тип возвращаемого значения функции

  • автор:

Возвращаемый тип

Тип возвращаемого значения функции определяет размер и тип значения, возвращаемого функцией. Он соответствует в type-specifier разделе Синтаксис:

Синтаксис

function-definition :
declaration-specifiers opt attribute-seq opt declarator declaration-list opt compound-statement

/* attribute-seq используется только в системах Майкрософт */

declaration-specifiers :
storage-class-specifier declaration-specifiers необ.
type-specifier declaration-specifiers необ.
type-qualifier declaration-specifiers необ.

type-specifier :
void
char
short
int
__int8 /* Только для систем Майкрософт */
__int16 /* Только для систем Майкрософт */
__int32 /* Только для систем Майкрософт */
__int64 /* Только для систем Майкрософт */
long
long long
float
double
long double
signed
unsigned
struct-or-union-specifier
enum-specifier
typedef-name

может указать любой type-specifier основной тип, тип структуры или объединения.

Тип возвращаемого значения, указанный в определении функции, должен соответствовать возвращаемому типу в объявлениях функций в любом другом месте программы. Функция возвращает значение при выполнении оператора return , содержащего выражение. Выражение вычисляется, преобразуется в тип возвращаемого значения (при необходимости) и осуществляется возврат в точку, где была вызвана функция. Если функция объявлена с типом возвращаемого значения void , оператор return, содержащий выражение, создает предупреждение, и выражение не вычисляется.

В приведенных ниже примерах показываются возвращаемые значения функции.

typedef struct < char name[20]; int id; long class; >STUDENT; /* Return type is STUDENT: */ STUDENT sortstu( STUDENT a, STUDENT b )

В этом примере определяются тип STUDENT с помощью объявления typedef , а также функция sortstu , чтобы иметь возвращаемый тип STUDENT . Функция выбирает и возвращает один из двух своих аргументов структуры. В последующих вызовах этой функции компилятор проверяет, что аргументы имеют тип STUDENT .

Эффективность можно увеличить путем передачи указателей на конкретную структуру, а не на всю структуру.

char *smallstr( char s1[], char s2[] )

В этом примере определяется функция, возвращающая указатель на массив символов. Функция принимает в качестве аргументов две строки (два массива) символов и возвращает указатель на более короткую из них. Указатель на массив указывает на первый из элементов массива и имеет его тип; таким образом, возвращаемый тип функции — указатель на тип char .

Объявлять функции с возвращаемым типом int перед их вызовом не требуется, хотя рекомендуется использовать прототипы, чтобы для аргументов и возвращаемых значений включалась правильная проверка типа.

Как в TS получить тип, возвращаемого функцией результата?

Функция runAgents принимает дикт с классом, у которого есть метод parse()
и возвращяет дикт с результатами работы функции.

Как объявить тип результата (IAgentsResult) функции runAgents что бы TS сам подставлял правильные типы в зависимости от входного типа?

export interface IAgentList <[key: string]: IAgentBase> export interface IAgents extends IAgentList < items?: IItemsParser; page?: IPageParser; parser?: IWebParser; >export interface IAgentBase < parse(): Promise; > export interface IItemsParser extends IAgentBase  < >export interface IPageParser extends IAgentBase  < >export interface IWebParser extends IAgentBase  < >export interface IAgentsResult  < items?: IItem[]; page?: IDataSet[]; parser?: any; >// в реальности все иначе, написал для понимания желаемого результата async function runAgents(agents: IAgentList): Promise < const result: IAgentsResult= <>; Object.keys(agents).forEach( async key => result[key] = await agents[key].parse() ); return result; > const agents : IAgents = const result = runAgents(agents)
  • Вопрос задан более трёх лет назад
  • 765 просмотров

Как получить тип аргумента функции или ее возвращаемый тип?

Очередной странный вопрос. Навеян книгой Discovering Modern C++ Готтшлига. Пытаюсь написать шаблон, который бы возвращал функтор, применяющий некоторую функцию рекурсивно предопределенное количество раз. Примерно так:

template class Recurs < public: Recurs(Func f):f(f)<>X operator()(X x) < return f(Recurs(f)(x)); > private: Func f; >; template class Recurs  < public: Recurs(Func f):f(f)<>X operator()(X x) < return f(x); >private: Func f; >; 

Так как использование в духе

auto f = [](double x) < return cos(x); >; Recurs r(f); r(0.1); 

душу не греет, сделал такую функцию:

template auto calc_N(Func f, X x) -> decltype(f(x)) < return Recurs(f)(x); > 

Функция сама по переданным значениям выводит типы, так что можно вычислять как

calc_N(f,0.1); 

Но мне не понравилось, что каждый раз создается объект Recurs. . Хотелось бы получать его один раз, и вызывать как функтор — типа,

template decltype(auto) make_N(Func f) . auto g = make_N(f); g(0.1); 

И вот тут у меня затык. Я написал примерно так —

template decltype(auto) make_N(Func f) < return Recurs(f); > 

но что мне теперь писать вместо . . В принципе, меня устроит в данном случае и тип аргумента f , и тип ее возвращаемого значения (для рекурсии они должны совпадать), но как их записать? И еще — насколько я помню, decltype(auto) — это уже C++14. А можно ли такое сотворить на версиях языка помладше, и как?

Как указать тип возвращаемого значения?

Есть функция, принимающая в качестве первого аргумента наименование поля объекта, а в качестве второго — функцию, в которую передается значение этого поля.

interface State < count: number; >function foo(key: keyof State, callback(value: ?)=> <>)

Как указать тип value в соответствии с переданым ключом?

  • Вопрос задан более трёх лет назад
  • 151 просмотр

1 комментарий

Средний 1 комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *