#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;
}
有没有办法在结构中存储Key
和Value
类型?与st1结构类似,存储类型int
的键和类型int
的值或结构中的任何模板类型。我想稍后用它进行类型比较。我收到以下错误。
invalid use of ‘st<int, int>::KeyType’
if(typeid(st1.KeyType) == typeid(int))
我想存储初始化的类型以存储在结构中。
答案 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)
只需使用Key
和Value
代替结构模板中的显式std::string
和int
类型:
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;
...
};