有没有办法获取或定义模板的 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()...};
这里我必须给模板一个特定的类型(例如int
、std::string
或其他)以使编译通过。但是,我要获取的不是实例化模板类型,而是关于模板class自身的类型,以便区分。
可能吗?或者我必须使用一些实例化类型来实现我的目标?
模板不是类型。只有类型有 typeids。
template<template<class...>class>struct template_tag{};
这是一个模板。
template_tag<_Dependencies>
这是一个类型。
取template_tag<your template>
的typeid。
旁白:
请注意,您命名类型 _Dependencies
的程序格式不正确,无需诊断。请停止模仿 std headers。他们可以命名你不允许的类型。
切勿以 _
开头后跟大写字母命名任何名称。永远不要命名任何包含两个 __
的东西。两者均由标准保留,仅供编译器和标准库实现者使用。
我有一个模板 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()...};
这里我必须给模板一个特定的类型(例如int
、std::string
或其他)以使编译通过。但是,我要获取的不是实例化模板类型,而是关于模板class自身的类型,以便区分。
可能吗?或者我必须使用一些实例化类型来实现我的目标?
模板不是类型。只有类型有 typeids。
template<template<class...>class>struct template_tag{};
这是一个模板。
template_tag<_Dependencies>
这是一个类型。
取template_tag<your template>
的typeid。
旁白:
请注意,您命名类型 _Dependencies
的程序格式不正确,无需诊断。请停止模仿 std headers。他们可以命名你不允许的类型。
切勿以 _
开头后跟大写字母命名任何名称。永远不要命名任何包含两个 __
的东西。两者均由标准保留,仅供编译器和标准库实现者使用。