gpt4 book ai didi

c++ - 如何使用两个模板模板参数指定共享模板变量?

转载 作者:行者123 更新时间:2023-11-30 03:53:59 25 4
gpt4 key购买 nike

我正在尝试构建一个小型测试框架。我有一个函数接受两个由相同类型组成的类列表变量,我计划使用模板模板参数作为接口(interface)的一部分。到目前为止,我有这个,

    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;
}

assertEquals在 if 条件下是另一个函数。我的问题是,接口(interface)是否正确?其次,我将如何使用它?我试过了,没用,

    Test::assertEquals<int, std::vector, std::vector>(haystack, needle);

Test::只是函数所在的类,haystackneedle类型为 std::vector<int> .

最佳答案

您的接口(interface)将不接受 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++ - 如何使用两个模板模板参数指定共享模板变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29817224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com