动态类型推导相当于std :: is_convertible

时间:2017-12-13 10:27:26

标签: c++ dynamic type-conversion type-deduction

我想根据指针保持值的动态类型调用正确的模板函数。我尝试使用$array=array(); foreach($results as $row) { $policy_id = $wpdb->get_results($wpdb->prepare("SELECT meta_value FROM wp_frm_item_metas WHERE field_id=%d AND item_id=%s", 203, $row->id)); $policy_transaction_type = $wpdb->get_results($wpdb->prepare("SELECT meta_value FROM wp_frm_item_metas WHERE field_id=%d AND item_id=%s", 390, $row->id)); $policy_transaction_type = $policy_transaction_type[0]->meta_value; $policy_id = $policy_id[0]->meta_value; $array[] =$policy_id; } ,但它只检查隐式可转换性。例如:

std::is_convertible

此代码结果:

  

元素类型:未知,真实类型:B

     

元素类型:未知,真实类型:B

     

元素类型:未知,真实类型:C

有没有办法编写一个重载函数,试图动态推导出传递参数的类型,或明确列出#include <iostream> #include <string> #include <vector> #include <type_traits> #include <memory> struct A { A() = default; virtual ~A() = default; }; struct B: public A { B() = default; virtual ~B() = default; }; struct C: public A { C() = default; virtual ~C() = default; }; template <typename T> std::string get_type_string(std::enable_if<std::is_convertible<T, A>::value, T*>) { return "A"; } template <typename T> std::string get_type_string(std::enable_if<std::is_convertible<T, B>::value, T*>) { return "B"; } template <typename T> std::string get_type_string(T*) { return "unknown"; } int main() { std::vector<std::unique_ptr<A>> container; container.emplace_back(new B()); container.emplace_back(new B()); container.emplace_back(new C()); for(const auto& value: container) { auto ptr = value.get(); std::cout << "Element of type: " << get_type_string(ptr) << ", "; std::cout << "Real type: " << (dynamic_cast<B*>(ptr) ? "B" : dynamic_cast<C*>(ptr) ? "C" : "unknown") << '\n'; } } 次尝试的唯一方法?

由于很多评论都在问我为什么不修改数据结构本身: dynamic_cast是我想根据其类型处理的数据对象。我提供了一个通用数据文件(由使用相同数据框架的人生成),我从硬盘中读取了这个。当我向数据框架询问给定数据文件中哪些键可用时,它给出了一个由通用基指针类型组成的列表(在示例中用class B, C, etc.表示)。我想对这个列表的元素进行操作,但我想做的事情取决于底层类型。

0 个答案:

没有答案