我想根据指针保持值的动态类型调用正确的模板函数。我尝试使用$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.
表示)。我想对这个列表的元素进行操作,但我想做的事情取决于底层类型。