有没有办法获取或定义模板的 typeid?

Is there a way to get or define typeid of a template?

我有一个模板 class,它依赖于多个模板 class,如下所示:

#include <vector>
#include <string>
#include <typeinfo>
#include <iostream>

template <typename _T> 
struct Foo {
    _T mem;
};

template <typename _T> 
struct Bar {
    _T mem;
};

template <template <typename> typename ... _Dependencies>
struct Target {
    static std::vector<std::string> getSignature() {
        std::vector<std::string> vec{typeid(_Dependencies<int>).name()...};
        return vec;
    };
}; 

int main () {
    for (auto& item : Target<Foo, Bar>::getSignature()) {
        std::cout << item << std::endl;
    }; 
    return 0;
}

请注意这一行:

std::vector<std::string> vec{typeid(_Dependencies<int>).name()...};

这里我必须给模板一个特定的类型(例如intstd::string 或其他)以使编译通过。但是,我要获取的不是实例化模板类型,而是关于模板class自身的类型,以便区分。

可能吗?或者我必须使用一些实例化类型来实现我的目标?

模板不是类型。只有类型有 typeids。

template<template<class...>class>struct template_tag{};

这是一个模板。

template_tag<_Dependencies>

这是一个类型。

template_tag<your template>的typeid。

旁白:

请注意,您命名类型 _Dependencies 的程序格式不正确,无需诊断。请停止模仿 std headers。他们可以命名你不允许的类型。

切勿以 _ 开头后跟大写字母命名任何名称。永远不要命名任何包含两个 __ 的东西。两者均由标准保留,仅供编译器和标准库实现者使用。