C++根据其模板定义一个类成员类型

标签 c++ metaprogramming template-meta-programming

在我们的代码中,我们有以下类:

template<class A, class B>
class myClass
{
    typedef std::list<Object<A,B>> MyList;
    typedef std::map<A, typename mList::iterator> MyMap

    MyList mList;
    MyMap mMap;
}

A 类是元编程的,它可以是字符串、整数等。 我想更改代码,以便在类 A 是“元字符串”的情况下使用映射,否则将使用 unordered_map。

我已经尝试添加更多的元编程但还没有成功:

template< class A, class B>
struct MapType // default
{
    typedef std::list<Object<A,B>> MyList;
    typedef std::unordered_map<A,B> MyMap;
}

//TODO struct with templated A (string) to use std::map

template<class A, class B>
class myClass
{
    ???? // if A ~ String define myMap to MAP . otherwise unordered

    MyList mList;
    MyMap mMap;
}

对于使用不同 map 类型的任何其他建议也将不胜感激。

谢谢

最佳答案

一个简单的解决方案是使用 std::conditional 来检查 A 是否与您的“元字符串”类相同(我选择了 std: :string 用于演示目的):

template<class A, class B>
class myClass
{
    std::list<Object<A,B>> mList;
    std::conditional_t<std::is_same<A,std::string>::value,
                       std::map<A,B>, std::unordered_map<A,B>> mMap;
};

另一种可能性是使用部分特化:

template<class A, class B>
class myClass
{
    std::list<Object<A,B>> mList;
    std::unordered_map<A,B> mMap;
};

template<class B>
class myClass<std::string,B>
{
    std::list<Object<std::string,B>> mList;
    std::map<std::string,B> mMap;
};

关于C++根据其模板定义一个类成员类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40356688/

相关文章:

c++ - 如何用值 01 重复初始化 vector<bool>?

c++ - std::cout 线程安全格式化和 io 操作

ruby - 无需 eval 即时创建 Ruby 类

c++ - enable_if 可以用作非额外参数(例如,用于构造函数)吗?

template-meta-programming - 通过乘法生成一个查找表来除以 10 位整数

c++ - 反向 C++ 中的唯一数据

c++ - SFML 网络问题

perl - 为什么我不能使用 Perl 变量的值来访问词法变量名?

python - 如何使用 Python 中传播的方法参数覆盖错误日志记录?

c++ - 元编程 : using a const array