Вы не можете пройти в typename
как нормальный аргумент функции, то есть ваш сниппет
using UGS12_FMT = some_type;
auto file = CreateFile(4,3,2,UGS12_FMT); // error
никогда не будет работать (кроме случаев, когда вы сделаете CreateFile
макрос, который strongly discouraged).
Вместо этого вы можете по существу использовать один из трех альтернативных методов.
перегрузки функция принимать различные аргументы пустого типа (так называемый тег-диспетчерская):
// declarations of tag types
struct format1 {} fmt1;
struct format2 {} fmt2; // etc
// overloaded file creation functions
file_type CreateFile(args, format1);
file_type CreateFile(args, format2);
// usage:
auto file = CreateFile(4,3,2,fmt1); // use format1
Используйте template
(и специализироваться его для различных типов форматов)
template<typename Format>
file_type CreateFile(args); // generic template, not implemented
template<> file_type CreateFile<Format1>(args); // one speciliasation
template<> file_type CreateFile<Format2>(args); // another speciliasation
auto file = CreateFile<Format1>(4,3,2); // usage
Передайте информацию, используя тип enum
.
enum struct format {
f1, // indicates Format1
f2 }; // indicates Format2
file_type CreateFile(args,format);
auto file = CreateFile(4,3,2,format::f1);
Наконец, вы можете объединить эти различные подходы с использованием traits
классов, подобные методы.
Я не вижу, как RTTI подходит здесь. – jweyrich
* Если * вы не можете использовать шаблоны, и вам нужно сделать что-то, что в конечном итоге зависит от типа, вы можете использовать информацию RTTI (обычно на карте типа_info для функции) для условного выполнения действий. Это исключает необходимость написания, возможно, длинного и не очень надежного перечисления. –
Мы не знаем, сколько типов файлов рассматривается OP, но если он собирается писать код для обработки каждого из них, сохранение 'enum' вместе с' struct' является самой простой задачей.Кроме того, 'std :: type_info :: name()' не является согласованным среди компиляторов, поэтому, если рассматривается переносимость, я вижу, что в качестве основного con. – jweyrich