我想定义一个函数,它打印模板参数列表中类型的typeid名称。该函数不接受值参数。例如,调用print<int>()
应该打印int
,print<int, double>()
应该打印int, double
,调用print<>()
应该输出字符串no types
。
我有一个可行的解决方案,但它使用了一个额外的vector
来完成这一点,由这个answer建议:
#include <iostream>
#include <vector>
template<class... T>
void print() {
std::vector<const char*> ids{ typeid(T).name()... };
if (ids.empty()) {
std::cout << "no types\n";
return;
}
const auto last = ids.size() - 1;
for (size_t i = 0; i < last; i++)
std::cout << ids[i] << ", ";
std::cout << ids[last] << '\n';
}
int main() {
print<>();
print<int, double, char>();
return 0;
}
字符串
正如你所看到的,这个函数在编译时不是很友好。我试图创建一个不涉及向量的代码版本,但是有一个不同的问题。
#include <iostream>
template<typename... Types>
void print() {
((std::cout << typeid(Types).name() << ", "), ...);
}
template<>
void print() {
std::cout << "no types\n";
}
int main() {
print<>();
print<int, double, char>();
return 0;
}
型
- 输出 *
no types
int, double, char,
型
此版本在模板参数列表中的最后一个类型后打印一个逗号。我想去掉这个逗号。
1条答案
按热度按时间zz2j4svz1#
要让逗号只出现在类型之前而不是之后,您可以打印第一个类型,然后打印所有其他类型,并在类型之前使用逗号
个字符
注意,只有msvc打印
int
,clang和gcc都使用i
作为int,参见typeid如果你想用循环的方法,那么你可以用一个std::array来代替向量,它不做堆分配in the assembly
型