我正在尝试编写一个小模板函数,该函数为传递给它的模板返回连续的整数 ID。以下内容适用于许多模板,但不适用于采用非类型参数的模板(如 std::array)。有什么办法可以让这项工作更普遍吗?如果没有,我最好的选择是什么? (我很想相信调用者只传递模板模板参数,并强制它们包含某种毫无意义的默认模板参数,因此它是普通类型 T:
ttypeid<vector<void>>()
、ttypeid<array<void, 0>>()
等)
#include <atomic>
#include <vector>
#include <map>
#include <array>
#include <iostream>
using namespace std;
inline unsigned gen_id() {
static atomic<unsigned> id = 0;
return ++id;
}
template <template<typename ...> typename T>
inline unsigned ttypeid() {
static unsigned id = gen_id();h
return id;
}
int main() {
cout << ttypeid<vector>() << endl;
cout << ttypeid<map>() << endl;
// cout << ttypeid<array>() << endl;
//
// error: no matching function for call to
// ‘ttypeid<template<class _Tp, long unsigned int _Nm> struct std::array>()’
return 0;
}
不幸的是,类型和非类型模板(可变参数)参数不能很好地混合。
对于
std::array
,您可以添加以下内容:
template <template<typename T, auto,typename...> typename T>
inline unsigned ttypeid() {
static unsigned id = gen_id();
return id;
}
但是,如果您想处理另一个模板,那么您需要编写另一个重载。好处是非类型模板参数并不丰富。在您自己的模板中,您可以通过将它们包装在类型中而不是使用裸值来避免它们。