使用模板参数的 type 作为 map<“type”, int 的键>

Use the type of a template parameter as key for a map<"type", int>

提问人:sancho.s ReinstateMonicaCellio 提问时间:11/8/2023 最后编辑:genpfaultsancho.s ReinstateMonicaCellio 更新时间:11/8/2023 访问量:67

问:

我的意思是设置一个映射,其中键是变量类型,值是 s(我以后可以更改它)。 然后,在模板化函数(不是类成员)中,使用简化示例mint

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] = 1m[double] = 2

至于打印T的正确方法,我可以找到一些东西。

C++ 模板 C++17

评论


答:

9赞 j6t 11/8/2023 #1

您可以使用 std::type_index。它是旨在用作地图中的键的包装器。使用运算符生成类型的对象。std::type_infostd::type_infotypeid

然后,您的函数和映射如下所示:

#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
我添加了一种用值填充地图的可能方法:使用初始值设定项列表。如果您事先知道所需的类型,则可以这样做。