Thr*_*ton 1 c++ templates c++11
我正在为在不同容器类型上运行的库编写测试平台,即
std::vector<int>
std::vector<char>
std::vector<bool>
std::list<int>
# etc
Run Code Online (Sandbox Code Playgroud)
我想通过基本上做std::vector, std::list, std::forward_listwith的交叉产品来自动生成测试,<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();
}
Run Code Online (Sandbox Code Playgroud)
然而,这样做会按照单词类型的顺序注册基准测试,即char首先全部,然后全部unsigned int等。我想反转这个,并首先指定容器类型,然后迭代该容器类型的单词类型。如何在不提供类型的std::vector情况下提供容器类型作为模板参数?只是传递std::vector给我“没有匹配的函数调用......”错误。我能想到的唯一技巧是为容器提供一些虚拟值类型,然后稍后将它们重新绑定到所需的类型。
你如何提供像 std::vector 这样的容器类型作为模板参数而不提供类型?
您不能将模板作为模板类型参数传递,因为模板不是类型。但是您可以将它们作为模板模板1参数传递。例子:
template<template<typename...> typename C>
void foo();
foo<std::vector>();
Run Code Online (Sandbox Code Playgroud)
1不是打字错误