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

问题描述

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

#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 或 sth 其他)以使编译通过。但是,我要得到的不是实例化模板类型,而是模板类self的类型,以便区分。

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

解决方法

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

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

这是一个模板。

template_tag<_Dependencies>

这是一种类型。

template_tag<your template> 的 typeid。

旁白:

请注意,您命名类型为 _Dependencies 的程序格式不正确,不需要诊断。请停止模仿 std 标头。他们可以命名您不允许使用的类型。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...