C++函数,接受enum并返回要在模板中使用的typedef类类型
C++ Function, take in enum and return a typedef class type to be used in template?
是否可以编写一个(内联?)C++函数,在这里我们接受一个枚举作为输入,并返回一个可以在模板声明中使用的类类型?
我的直觉是,既然枚举类型的数量有限,那么它应该是可能的吗?
enum MyEnumType { A, B, C };
class MyClassA { };
class MyCLassB { };
class MyClassB { };
template class<T>
class ATemplatedClass {
// ...
};
NotSureWhatReturnType ConvertEnumToClassType(MyEnumType type) {
switch (type) {
case A: return MyClassA;
case B: return MyClassB;
case C: return MyClassC:
default: throw;
}
}
MyEnumType type = GottenSomewhere();
auto class_type = ConvertEnumToClassType(type);
ATemplatedClass<class_type> is_this_possible;
函数不能返回类型。你需要一个元函数:
template <MyEnumType>
struct ConvertEnumToClassType;
template <>
struct ConvertEnumToClassType<A> {
typedef MyClassA type;
};
template <>
struct ConvertEnumToClassType<B> {
typedef MyClassB type;
};
// … etc.
typedef ConvertEnumToClassType<A> class_type;
ATemplatedClass<class_type> is_this_possible;
当然,这只适用于编译时(因为那是解析模板的时候)。
有几种方法。
首先,如果您在编译时知道enum
,则可以创建一个元函数,将enum
作为模板参数,并按预期返回tyoe。
如果你不这样做,有几种方法。
首先,您可以执行一个神奇的切换,获取一个函子并使用运行时确定的enum
值来调用它。有趣的是,最好先实现上述元函数解决方案。
第二种方法是类型擦除。您返回的对象在外部是统一的,但在内部它知道它有一个特定的类型。以boost::variant
。现在,访问该内部tyoe可以涉及上述解决方案(类似于boost
访问者),或者可能是在内部存储不同行为的virtual
或std::function
接口。
最后,您可以使用魔术切换技术,将运行时enum
映射到编译时enum
(而不是类型),然后只使用第一种技术。
神奇的切换技术并不是那么神奇。编写一个switch语句,并在每种情况下调用一个具有类型或编译时常数的模板函子。为了让它变得有趣,可以将开关的"body"作为模板参数,甚至可以使用一些元编程来通过嵌套的if
或数组查找生成开关代码。不需要那些先进的技术。
使用模板并专门化:
template <MyEnumType> struct ConvertEnum;
template <> struct ConvertEnum<A> { typedef MyClassA type; };
template <> struct ConvertEnum<B> { typedef MyClassB type; };
template <> struct ConvertEnum<C> { typedef MyClassC type; };
用法:
ConvertEnum<A>::type x;
相关文章:
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- 从 Typedef 数据类型中删除常量
- 使用智能指针指向 C 库中的结构,该结构通过 typedef 隐藏实现(即不完整的类型)
- 是否可以分别专注于 typedef 及其基础类型?
- 如何对绑定的成员方法进行typedef,然后将该类型用作模板参数
- 显式调用 typedef'd 类类型的析构函数的正式正确方法
- "typedef"类型名称是否可以像"struct"定义那样声明指向结构的指针?
- 具有未声明/未定义类型的 typedef 结构
- 使用 pybind11 绑定 typedef 类型的正确语法是什么?
- 通过 typedef 模板<类型名 T、T> 强制模板实例化 - 为什么有效?
- C和C 类型(TypeDEF)之间的差异
- 如何通过从变量中获取类型来访问内部 typedef
- C 通过Typedef定义新类型
- 使用#Define和Typedef与数据类型A一起使用
- typedef 类型不匹配,将其传递到函数中
- 如何使用函数签名的 typedef 作为 std::function 的类型参数
- 从 csv 文件中获取不同类型的数据,并将其放入 C++ 中的 typedef 结构中
- typedef 中的自定义类型为 Qt MetaType
- Swig 简单类型 typedef 参数