#c #header-files #auto
Вопрос:
У меня есть досье Foo.h
:
// Foo.h
#pragma once
int foo();
Также у меня есть Foo.cpp
файл, который реализует Foo.h
:
//Foo.cpp
#include "Foo.h"
int foo() {
return 5;
}
Есть ли способ сделать foo
функцию возвращаемым типом auto
? Это может быть полезно, если я создам функцию, возвращаемое значение которой зависит от функций сторонних библиотек, типы возвращаемых значений которых могут измениться в более поздних версиях.
Комментарии:
1.
auto foo();
по сути , это сокращениеtemplate <typename T> T foo();
, и компилятор должен быть в состоянии определить тип возвращаемого значения из кода. Если вы просто хотите избежать указания типа, определенного в другом месте, используйте псевдоним типа или определите свой собственный тип, который скрывает тип библиотеки.
Ответ №1:
Если вы хотите это сделать, вам нужно поместить определение функции (а не только объявление) в файл заголовка. В противном случае, как компилятор может определить тип foo
, вызывается ли он из другого исходного файла?
И если вы хотите определить функцию в заголовочном файле, вам нужно объявить ее встроенной, иначе компоновщик будет жаловаться на несколько определений.
Ответ №2:
Есть ли способ заставить функцию foo возвращать тип auto?
Только определив встроенную функцию. Что противоречит вашему предположению о том, что функция определена в отдельной единице перевода.
Это может быть полезно, если я создам функцию, возвращаемое значение которой зависит от функций сторонних библиотек
Для этой цели можно использовать псевдоним типа:
using return_type =
std::invoke_result<library_function, some_arg_t>;
return_type foo();