如何在结构中存储模板类型

时间:2017-08-24 09:55:46

标签: c++ templates

#include<iostream>
#include<typeinfo>
using namespace std;
template <class Key, class Value>
struct st
{
        typedef Key KeyType;
        typedef Value ValueType;
};
int main()
{
        st<int, int> st1;
        if(typeid(st1.KeyType) == typeid(int))
                cout<<"Yes";
        return 0;
}

有没有办法在结构中存储KeyValue类型?与st1结构类似,存储类型int的键和类型int的值或结构中的任何模板类型。我想稍后用它进行类型比较。我收到以下错误。

 invalid use of ‘st<int, int>::KeyType’
  if(typeid(st1.KeyType) == typeid(int))

我想存储初始化的类型以存储在结构中。

3 个答案:

答案 0 :(得分:2)

如果您可以使用C ++ 11或更高版本,则可以使用decltype

    if ( typeid(decltype(st1)::KeyType) == typeid(int) )
            cout<<"Yes";

或者,更好的恕我直言,std::is_same(评估编译时)

    if ( std::is_same<decltype(st1)::KeyType, int>::value )
            cout<<"Yes";

如果你可以使用C ++ 17,那么最后一个例子可以写成

    if constexpr ( std::is_same<decltype(st1)::KeyType, int>::value )
            cout<<"Yes";

所以cout << "Yes"是根据value的{​​{1}}编译的。

答案 1 :(得分:0)

你可以使用typedef或更新的选择: -

using KeyType = int;

(编辑后编辑问题)  对于你的简单例子来说可能有点过分,但鉴于你的实际用法不会那么简单,你可以考虑从2个结构中得出

template <typename keyType>
struct KeyedType 
{};

template <typename containedType>
struct Container{};

template < typename keyType, typename containedType >
struct st : public KeyedType<keyType> , Container<containedType>
{
    // etc
};

然后你可以使用动态强制转换进行比较。

st<int, int> st1;
if(dynamic_cast<KeyedType<int>*>(&st1) )

有一点奇怪的是必须获取一个指向st1的指针,该指针持有st1值,但如果你不是多态地使用st1,那么你应该知道它是什么类型(除非原因是未知的类型是代码在模板中,在这种情况下使用::在类型本身上已经如其他答案/评论中所述)

如果您确实进行了此更改,则可能完全避免进行类型比较(但这取决于问题中没有的内容)

答案 2 :(得分:0)

只需使用KeyValue代替结构模板中的显式std::stringint类型:

template <class Key, class Value>
struct st
{
    Key name;
    Value permission;   
};

或许您需要在代码中的其他地方引用这些类型?然后,您可以在模板中使用typedef,例如:

template <class Key, class Value>
struct st
{
    typedef Key   KeyType;
    typedef Value ValueType;

    ...
};