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

How to specify shared template variable with two template template parameters?

本文关键字:参数 变量 共享 两个 何使用      更新时间:2023-10-16

我正在尝试构建一个小型测试框架。我有一个函数,它接受两个由相同类型组成的类似 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:: 只是函数所在的类,haystackneedle 的类型为 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);