автоматический спецификатор в заголовочном файле

#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();