C++ 可变参数模板产品

标签 c++ c++11 templates

我正在为在不同容器类型上运行的库编写测试平台,即

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/

相关文章:

C++ WINAPI 按钮剪贴板 - 复制操作

c++ - 是否可以使用强制编译器错误扩展 typedef?

c++ - CRTP vs 过载和最终

C++ 元组链接问题 : undefined reference

c++ - C++ 中成员数量可变的模板类

javascript - 尝试显示数据时出现 mustache 循环错误

c++ - 默认初始化(带值初始化)参数包

c++ - 将集合的第一个第 n 个值复制到 C++ 中的 vector 的简单方法

c++ - 哪个更快 : Assigning same value to a variable, 或找出它是否已经设置?

c++ - 静态断言实例化时模板类型的大小