提问人:sancho.s ReinstateMonicaCellio 提问时间:11/8/2023 最后编辑:genpfaultsancho.s ReinstateMonicaCellio 更新时间:11/8/2023 访问量:67
使用模板参数的 type 作为 map<“type”, int 的键>
Use the type of a template parameter as key for a map<"type", int>
问:
我的意思是设置一个映射,其中键是变量类型,值是 s(我以后可以更改它)。
然后,在模板化函数(不是类成员)中,使用简化示例m
int
template<typename T>
void foo(vector<T>& v) {
int type_idx = m[T]; // How to use this?
const int n = v.size();
foo2(type_idx, n);
return;
}
这能做到吗?
定义 的步骤如何,使用它的步骤如何?m
一个基本的形式是
if constexpr (std::is_same_v<T, int>) {
foo2(1, n);
} else if constexpr (std::is_same_v<T, double>) {
foo2(2, n);
} else if ...
} else {
myprintf("Not implemented for type %s", T);
}
对应于 , , ...
但这比我想要的实现方式(如果可能的话)更麻烦。m[int] = 1
m[double] = 2
至于打印T的正确方法,我可以找到一些东西。
答:
9赞
j6t
11/8/2023
#1
您可以使用 std::type_index
。它是旨在用作地图中的键的包装器。使用运算符生成类型的对象。std::type_info
std::type_info
typeid
然后,您的函数和映射如下所示:
#include <typeinfo>
#include <typeindex>
#include <map>
#include <vector>
void foo2(int, int);
std::map<std::type_index, int> m{
{ typeid(int), 1 },
{ typeid(double), 2 },
};
template<typename T>
void foo(std::vector<T>& v)
{
int type_idx = m[typeid(T)];
const int n = v.size();
foo2(type_idx, n);
}
评论
0赞
j6t
11/8/2023
我添加了一种用值填充地图的可能方法:使用初始值设定项列表。如果您事先知道所需的类型,则可以这样做。
评论