如何使用两个模板模板参数指定共享模板变量
How to specify shared template variable with two template template parameters?
我正在尝试构建一个小型测试框架。我有一个函数,它接受两个由相同类型组成的类似 List 的变量,我计划使用模板模板参数作为界面的一部分。到目前为止,我有这个,
template <typename C, template <class> class A, template <class> class B>
static inline void assertEquals(const A<C>& expected, const B<C>& actual) {
auto success = 0, failure = 0;
for (auto iter1 = expected.cbegin(), iter2 = actual.cbegin();
iter1 != expected.cend() && iter2 != actual.cend(); ++iter1, ++iter2) {
if (Test::assertEquals<C>(*iter1, *iter2)) {
++success;
} else {
++failure;
}
}
cout << "Success: " << success << endl
<< "Failure: " << failure << endl;
}
if 条件中的assertEquals
是另一个函数。我的问题是,界面正确吗?其次,我将如何使用它?我试过这个无济于事,
Test::assertEquals<int, std::vector, std::vector>(haystack, needle);
Test::
只是函数所在的类,haystack
和 needle
的类型为 std::vector<int>
。
你的接口不接受std::vector
,因为它实际上需要两个模板参数:包含的类型和分配器。
您可以更改模板签名以接受可变参数模板模板,如下所示:
template <typename C, template <class...> class A, template <class...> class B>
static inline void assertEquals(const A<C>& expected, const B<C>& actual) {
或者,您可以显式设置默认参数:
template <typename C,
template <class, class = std::allocator<C>> class A,
template <class, class = std::allocator<C>> class B>
void assertEquals(const A<C>& expected, const B<C>& actual) {
但是,最好从 STL 容器成员类型中获取C
,如下所示:
template <class A, class B>
void assertEquals(const A& expected, const B& actual) {
static_assert(std::is_same<typename A::value_type, typename B::value_type>::value,
"Containers must have the same value type");
using C = typename A::value_type;
//...
这是一个更简单的界面。对于上述所有选项,编译器可以为您推导出模板参数,因此只需像这样调用它:
assertEquals(haystack, needle);
相关文章:
- 如何将C++闭包与变量参数同时重用——类似于JavaScript
- 扩展可变参数模板中的变量名称
- 在类构造函数中定义结构变量的参数
- 带有整数的变量参数列表
- 转发变量参数列表以模拟 std::thread
- 如何在不传递命令行参数的情况下在 c++ 中设置环境变量
- 存储稍后要转发的变量参数
- C++具有模板成员变量的类. 和参数内存输出
- 我应该如何在没有变量的情况下将相同的参数传递给 CMAKE 中的多个目标?
- 为变量模板的每个参数调用模板函数
- 具有推导参数的模板函数指针数组变量
- 函数参数变量总是需要 & 或 * 运算符吗?
- 为什么 beginthreadex 线程参数变量在父线程中没有更新
- 在 Metal 着色器代码中,如何定义函数的 in/out 参数变量?
- 如何在函数中使用非参数变量?
- 即将将引用作为函数中的参数传递以更改参数变量的值
- 基于不断变化的参数/变量的XML get值
- cocos2d-x v3 CallFunc作为参数/变量如何
- 在编译时使用c++元编程中的运行时参数(变量)
- 我可以返回一个非参数变量吗?