我正在为在不同容器类型上运行的库编写测试平台,即
std::vector<int>
std::vector<char>
std::vector<bool>
std::list<int>
# etc
我想通过做 std::vector, std::list, std::forward_list
的叉积来自动生成测试。与 <bool, char, int>
并且还按容器类型的顺序生成测试。我正在考虑用模板包做一些事情:
template <class C>
void register_containers() {
std::string container_name = demangle(typeid(C).name());
benchmark::RegisterBenchmark(container_name.c_str(), BM_Func, ArgObj());
}
template <class C, class C2, class... Args>
void register_containers() {
std::string container_name = demangle(typeid(C).name());
benchmark::RegisterBenchmark(container_name.c_str(), BM_Func, ArgObj());
register_containers<C2, Args...>();
}
template<class T>
constexpr void register_types() {
register_containers<std::list<T>, std::vector<T>>();
return;
}
template <class T,class T2, class... Args>
constexpr void register_types() {
register_containers<std::list<T>, std::vector<T>>();
register_types<T2, Args...>();
}
int main(int argc, char** argv) {
register_types<unsigned char, unsigned short, unsigned int, unsigned long long int>();
benchmark::Initialize(&argc, argv);
benchmark::RunSpecifiedBenchmarks();
}
然而,这样做会按照单词类型的顺序注册基准,即所有 char
首先,然后是所有unsigned int
等等。我想反转它,并首先指定容器类型,然后迭代该容器类型的单词类型。您如何提供容器类型,如 std::vector
作为模板参数而不提供类型?只需传入 std::vector
给我“没有匹配的函数调用...”错误。我能想到的唯一技巧是为容器提供一些虚拟值类型,然后稍后将它们重新绑定(bind)到所需的类型。
最佳答案
How do you provide container types like std::vector as a template parameter without also providing a type?
您不能将模板作为模板类型参数传递,因为模板不是类型。但是您可以将它们作为模板 template1 参数传递。例子:
template<template<typename...> typename C>
void foo();
foo<std::vector>();
1 不是错字
关于C++ 可变参数模板产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62564944/