我有多种格式类型,每种格式都有一个名称和一个分配给它们的值。我希望能够将格式类型作为参数传递给方法。声明看起来像CreateFile(4,3,2,UGS12_FMT)
,其中UGS12_FMT
是c ++类型。
请注意,我没有将实例作为参数传递。有关如何实现这一目标的任何建议吗?
答案 0 :(得分:1)
您无法传递 <application
android:name="App"
作为普通函数参数,即您的代码段
typename
永远不会有效(除非您using UGS12_FMT = some_type;
auto file = CreateFile(4,3,2,UGS12_FMT); // error
创建一个宏strongly discouraged)。
相反,您基本上可以使用三种替代技术中的一种。
重载函数以获取空类型的不同参数(所谓的标记调度):
CreateFile
使用// 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);
类将这些不同的方法组合为类似的技术。
答案 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
个对象给出的名称。
编辑:当然,确保模板无法提供您想要的内容,这将是首选方式。