切换取决于对象类型
switch depending on object type
我想知道是否有一种更好的方式(更易于阅读,更少的冗长)。
我有具有混凝土Foo实现类型的对象foo,可以将其称为foo1 .. foon。
我还具有FOO的描述的字符串表,例如foo1" bars the foo1"。我想做的是某种类型检查,具体取决于FOO的实际类型。目前我要做:
std::string fooUtils::translate(Foo * foo){
if(typeid(foo) == typeid(Foo1){
return "bars the Foo1";
}
else if
...
}
我想知道是否有更好的方法。
我想到的第一个是存储std :: map<STD :: TypeInfo,STD :: String> - 这是我热衷于寻求的解决方案,但我不知道将类型信息作为地图的钥匙的任何副作用(是否有?)。我还想知道是否有什么可以以较少的详细方式比较类型的东西,例如boost :: is_type<foo1,foo>或类似的东西。
这就是virtual
成员函数的目的:
std::string fooUtils::translate(Foo * foo) {
foo->translate();
}
with:
struct Foo {
virtual std::string translate() const { return "base"; }
};
struct Foo1 : Foo {
std::string translate() const override {
return "bars the Foo1";
}
};
这是type_info
搜索实用程序:
template<class T, class...Ts>
std::array<std::decay_t<T>, sizeof...(Ts)+1> make_array( T&& t, Ts&&...ts ) {
return {{ std::forward<T>(t), std::forward<Ts>(ts)... }};
}
template<class F, class T, size_t N>
std::array<T, N> sorted( std::array<T, N> arr ) {
std::sort( begin(arr), end(arr), F{} );
return arr;
}
struct p_type_info_sort {
bool operator()( std::type_info const* lhs, std::type_info const* rhs ) const {
return lhs->before(*rhs);
}
};
template<class...Ts, class T>
std::type_info const* which(T const& t) {
static const auto table=sorted<p_type_info_sort>(make_array(
(&typeid(Ts))...
));
auto r = std::equal_range( begin(table), end(table), &typeid(t), p_type_info_sort{} );
if (r.first==r.second) return nullptr;
return *r.first;
}
您执行which<A, B, C, D>(*a)
,然后返回类型 *a
的类型列表中的哪一项完全匹配(动态)。它通过返回type_info const*
来做到这一点,如果找不到匹配项,则可以通过nullptr
来做到这一点。
现在这通常是一个坏主意。以上仅具有确切的匹配。通常,如果您有那么多的多态性,则需要将其放入界面中,并且失败了,您可能会有其他一些设计缺陷。
实时示例
在此线程中,您可以找到type2enum转换和向后的enum2Type转换:如何进行键入参数包类?
答案的提取:
template<class T> type2enum();
#define TYPE2ENUM_SPEC(TYPE, ENUM)
template<> type2enum<TYPE>()
{ return ENUM; }
enum { T1enum, T2enum, T3enum }
TYPE2ENUM_SPEC(type1_t, T1enum);
TYPE2ENUM_SPEC(type2_t, T2enum);
TYPE2ENUM_SPEC(some_third_type_t, T3enum);
相关文章:
- std::unordered_map 类型对象声明期间出现"field has incomplete type"错误
- C++ 多态模板类,模板类型对象的实例化
- 如何分配适合容纳 T 类型对象的缓冲区(可能过度对齐、可能有运算符 new 等)
- 如何构造一个 std::variant 类型对象,其自身 Templated 和构造函数转发参数
- C++:初始化指向具有不同类型对象的指针数组
- 在类 C++ 中构造的模板类型对象
- 如何将颁发者名称设置为x509_req类型对象
- 将任何数据类型/对象作为参数传递以确定其大小
- 将引用类型对象的数组从C#封送到C++
- <T> 从类型对象创建类型<T1>对象的构造函数
- C++是否有现有的方法来检查对象是否是派生类型对象
- C 模板:创建与现有对象相同的类型对象
- 链接列表中的虚函数 - 多种返回类型(对象)
- 没有适当操作员()的类型对象的呼叫
- 制作垫子类型对象的数组.输出窗口显示同一帧
- 抽象类型对象的分配
- 在std::list中就地创建自定义类型对象
- 接受泛型列表类型对象的参数
- C++-将模板类型对象强制转换为特定的数据类型
- 试图在C++中打印存储在类型对象数组中的信息