【问题标题】:How to check type of container using template struct instead of function?如何使用模板结构而不是函数检查容器的类型?
【发布时间】:2025-12-26 04:05:17
【问题描述】:

在这篇check type of element in stl container - c++ 的帖子中,用户UncleBens 展示了如何使用结构same_type 和函数containers_of_same_type 来检查容器的类型

我正在尝试做同样的事情,除了我想使用结构而不是使用检查容器的函数。我有以下代码,但它给了我错误:

// Working
template<typename X, typename Y>
struct SameType {
    enum { result = 0 };
};

// Working
template<typename T>
struct SameType<T, T> {
    enum { result = 1 };
};

// This struct is not working
template<typename C1, typename C2>
struct SameContainerType {
    enum { value = SameType<typename C1::value_type, typename C2::value_type>::result };
};

#include <iostream>
#include <vector>
#include <list>

int main() {
    std::cout << SameType<int, int>::result << std::endl;;     // 1
    std::cout << SameType<int, double>::result << std::endl;;  // 0
    std::cout << SameContainerType<std::vector<int>(), std::list<int>()>::value;  // error
}

错误是,C1C2 必须是命名空间或类才能使用 ::

【问题讨论】:

  • 使用枚举来定义结构中的值已经过时了。您可以改用static constexpr 变量。
  • 我是新手。谢谢你的意见,我会考虑的。
  • 另外,只是继承自std:true_type 和 false 类型。所有酷的孩子都会这样做。 template&lt;typename X, typename Y&gt; struct SameType:std::false_type{};;而不是result,它暴露了value,并且实例也有一堆constexpr操作。
  • 是的,我在看介绍性讲座时已经看到了这种继承模式,但它对我来说仍然是新的,我会将它合并到我的结构中。 Ty 的建议

标签: c++ template-meta-programming


【解决方案1】:

std::vector&lt;int&gt;() 是一个返回std::vector&lt;int&gt; 的函数。您需要删除()

int main() {
    std::cout << SameType<int, int>::result << std::endl;;     // 1
    std::cout << SameType<int, double>::result << std::endl;;  // 0
    std::cout << SameContainerType<std::vector<int>, std::list<int>>::value; // 1
}

【讨论】:

    最近更新 更多