2012-02-20 5 views
0

У меня есть несколько типов форматов, каждый из которых имеет имя и назначенное им значение. Я хочу иметь возможность передать тип формата в качестве параметра в метод. Объявление будет выглядеть как CreateFile(4,3,2,UGS12_FMT), где UGS12_FMT - тип C++.C++: Использование типа класса в качестве параметра

Обратите внимание, что я не передаю экземпляр в качестве параметра. Любые предложения о том, как это сделать?

ответ

0

Может быть много способов сделать это. Первый метод, который наиболее рекомендуется, заключается в наследовании каждого из классов из общего родительского класса, поскольку они разделяют «имя» и «значение», как описано ранее.

Если вам действительно нужно знать, какой класс он находится в функции «CreateFile», вы бы лучше изменить реализацию функции, используя множество функций, как

CreateFile(ClassA a) 
CreateFile(ClassB a) 

вместо

CreateFile(Class x) 
    if x is an instance of ClassA 
     doSomething ... 
    else if x is an instance of ClassB 
     doSomething ... 
0

Вы хотите посмотреть, что такое RTTI. Поддержка зависит от компилятора, но есть базовая функциональность. Хорошее место для начала here.

Обратите внимание, что, например, для GCC вам понадобятся вспомогательные функции, чтобы развязывать имена, заданные объектами type_info.

EDIT: конечно, убедитесь, что шаблоны не могут предложить то, что вы хотите в первую очередь, это было бы предпочтительным способом.

+2

Я не вижу, как RTTI подходит здесь. – jweyrich

+0

* Если * вы не можете использовать шаблоны, и вам нужно сделать что-то, что в конечном итоге зависит от типа, вы можете использовать информацию RTTI (обычно на карте типа_info для функции) для условного выполнения действий. Это исключает необходимость написания, возможно, длинного и не очень надежного перечисления. –

+0

Мы не знаем, сколько типов файлов рассматривается OP, но если он собирается писать код для обработки каждого из них, сохранение 'enum' вместе с' struct' является самой простой задачей.Кроме того, 'std :: type_info :: name()' не является согласованным среди компиляторов, поэтому, если рассматривается переносимость, я вижу, что в качестве основного con. – jweyrich

1

Вы не можете пройти в typename как нормальный аргумент функции, то есть ваш сниппет

using UGS12_FMT = some_type; 
auto file = CreateFile(4,3,2,UGS12_FMT); // error 

никогда не будет работать (кроме случаев, когда вы сделаете CreateFile макрос, который strongly discouraged).

Вместо этого вы можете по существу использовать один из трех альтернативных методов.

  1. перегрузки функция принимать различные аргументы пустого типа (так называемый тег-диспетчерская):

    // 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 
    
  2. Используйте 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 
    
  3. Передайте информацию, используя тип enum.

    enum struct format { 
        f1,    // indicates Format1 
        f2 };    // indicates Format2 
    file_type CreateFile(args,format); 
    
    auto file = CreateFile(4,3,2,format::f1); 
    

Наконец, вы можете объединить эти различные подходы с использованием traits классов, подобные методы.

Смежные вопросы