Я хотел бы объединить вывод типа возвращаемого значения и явное создание экземпляра шаблона (например, f<int>
вместо template<typename T> f<T>
). В приведенном ниже примере показано, как это можно сделать в одном файле воспроизвести с кодом .
#include <type_traits>
#include <iostream>
#include <string>
enum Enum { String, Int };
template <Enum E>
auto f();
template <>
auto f<Enum::String> () {
return "string";
}
template <>
auto f<Enum::Int> () {
return 2;
}
int main()
{
const Enum e = Enum::String;
auto a = f<e>();
const Enum g = Enum::Int;
auto b = f<g>();
return 0;
}
Вопрос: Как объединить возврат вывод типа, создание экземпляра шаблона с заголовочными файлами?
Что бы я хотел:
// f.hpp
template<Enum E> auto f();
// f.cpp
f<Enum::Int> f() { // ...
// other_file.cpp
#include "f.hpp"
auto a = f<Enum::Int>();
Ошибка: function 'f<Enum::Int>' with deduced return type cannot be used before it is defined
.
Идеи:
IMO ошибка имеет смысл, поскольку создание функции не находится в заголовке и, следовательно, не было включено в other_file.cpp
.
Я не могу для записи экземпляров в f.hpp
, поскольку они являются экземплярами (очевидно).
Я думал об использовании inline
, но это не помогло (почему?).
Кто-нибудь может мне помочь?