c ++:使用类类型作为参数

时间:2012-02-20 02:57:27

标签: c++

我有多种格式类型,每种格式都有一个名称和一个分配给它们的值。我希望能够将格式类型作为参数传递给方法。声明看起来像CreateFile(4,3,2,UGS12_FMT),其中UGS12_FMT是c ++类型。

请注意,我没有将实例作为参数传递。有关如何实现这一目标的任何建议吗?

3 个答案:

答案 0 :(得分:1)

您无法传递 <application android:name="App" 作为普通函数参数,即您的代码段

typename

永远不会有效(除非您using UGS12_FMT = some_type; auto file = CreateFile(4,3,2,UGS12_FMT); // error 创建一个宏strongly discouraged)。

相反,您基本上可以使用三种替代技术中的一种。

  1. 重载函数以获取空类型的不同参数(所谓的标记调度):

    CreateFile
  2. 使用// 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
  3. 使用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
  4. 最后,您可以使用enum struct format { f1, // indicates Format1 f2 }; // indicates Format2 file_type CreateFile(args,format); auto file = CreateFile(4,3,2,format::f1); 类将这些不同的方法组合为类似的技术。

答案 1 :(得分:0)

可能有很多方法可以做到这一点。第一种方法是最推荐的方法,它是从公共父类继承每个类,因为它们共享“name”和“value”,如前所述。

如果你真的需要知道它在函数“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 ...

答案 2 :(得分:0)

你想看看什么是RTTI。支持因编译器而异,但有基本功能。一个开始here的好地方。

请注意,例如对于GCC,您需要帮助函数来取消type_info个对象给出的名称。

编辑:当然,确保模板无法提供您想要的内容,这将是首选方式。