Возвращаемый тип
Тип возвращаемого значения функции определяет размер и тип значения, возвращаемого функцией. Он соответствует в 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 комментарий