在运行时获取模板类型

5
我有一个方法,可以获取 C 风格结构体的向量,并逐个处理其元素。
我希望扩展它以接收更多类型的结构体,而不重复我的代码。
由于所有结构体类型都将包含相同的字段名称,因此使用模板来实现这个新需求最为优雅。
然而,我无法决定如何传递第二个参数给 write_db 函数;该参数是每种结构体类型的枚举,是否有任何选项可以在运行时获取它?
enum policy_types { 
    POLICY_TYPE_A,
    POLICY_TYPE_B,
    ...
}; 

// old implementation - suitable for single struct only
int policyMgr::write_rule(std::vector <struct policy_type_a> & list) { 
    //conduct boring pre-write check
    //...

    for (auto & item : list ) { 
        int ret = write_db(item.key1, POLICY_TYPE_A_ENUM, &item.blob);
}

//new implementation - suitable for multiple structs. 
template <POLICY>
int policyMgr::write_rule(std::vector <POLICY> & list) { 
    for (auto & item : list ) { 
        int ret = write_db(item.key1, type(POLICY) /* how can i get enum according to template type */, &item.blob);
}

我考虑为每个结构体实例添加枚举值作为常量,但希望找到更好的方法,不需要改变基本结构体格式。

2个回答

11

如果您不想添加成员,可以提供一个“traits”类型。

template<typename P>
struct PolicyTraits {};

template<>
struct PolicyTraits<policy_type_a> 
{
    static enum { Type = POLICY_TYPE_A };
};

template<>
struct PolicyTraits<policy_type_b> 
{
    static enum { Type = POLICY_TYPE_B };
};

template <typename A>
int policyMgr::write_rule(const std::vector<A> & list) { 
    for (const auto & item : list ) { 
        int ret = write_db(item.key1, PolicyTraits<A>::Type, &item.blob);
    }
}

是的,这是更优雅(并且类似于C++标准库)的方法:与我的解决方案不同,它不会污染“A”类。加一分。 - Bathsheba
我会避免在traits/policy中将value命名为type - Jarod42
但这对于运行时不起作用!如果向量由基础策略类专门化并包含派生策略子类型...模板将仅接收其向量专业化的特征。 - barney
@barney 如果向量包含 A,它包含的是 A,而不是 A 的子类型。 - molbdnilo

3
在每个可 POLICY 的类中添加一个类型字段,foo 是其中的一个示例。
struct foo
{
    /*your other bits*/
    static const policy_types type = POLICY_TYPE_whatever; /*older standards
                                  might require definition in a source file */.
};

然后根据实际情况使用 write_db(item.key1, POLICY::type)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接