C++ 可变参数模板产品

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给我“没有匹配的函数调用......”错误。我能想到的唯一技巧是为容器提供一些虚拟值类型,然后稍后将它们重新绑定到所需的类型。

eer*_*ika 5

你如何提供像 std::vector 这样的容器类型作为模板参数而不提供类型?

您不能将模板作为模板类型参数传递,因为模板不是类型。但是您可以将它们作为模板模板1参数传递。例子:

template<template<typename...> typename C>
void foo();

foo<std::vector>();
Run Code Online (Sandbox Code Playgroud)

1不是打字错误