问题描述
#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
或 sth 其他)以使编译通过。但是,我要得到的不是实例化模板类型,而是模板类self的类型,以便区分。
有可能吗?或者我必须使用一些实例化类型来实现我的目标?
解决方法
模板不是类型。只有类型有 typeid。
template<template<class...>class>struct template_tag{};
这是一个模板。
template_tag<_Dependencies>
这是一种类型。
取 template_tag<your template>
的 typeid。
旁白:
请注意,您命名类型为 _Dependencies
的程序格式不正确,不需要诊断。请停止模仿 std 标头。他们可以命名您不允许使用的类型。
切勿以 _
开头后跟大写字母的名称命名任何内容。永远不要命名任何包含两个 __
的东西。两者都由标准保留,仅供编译器和标准库实现者使用。