如何从STL容器实例中获取元素类型

How to get element type from STL container instance?

本文关键字:获取 元素 类型 实例 STL      更新时间:2023-10-16

我知道value_type、key_type。。。但它们对类型进行操作,而不是对实例进行操作。我试过了比如:

std::set<uint64_t> mySet;   
decltype (mySet)::value_type pos;

但它不起作用。

编辑:我使用VS 2010。

EDIT2:此代码的用途是获取一个类型,将其提供给boost::lexical_cast<>有没有一种变通方法可以实现这一点?我想要这样的东西:

   mySet.insert(boost::lexical_cast<decltype(mySet)::value_type>(*it));
  // it is a iterator in vector of strings

第三版:这个作品:

mySet.insert(boost::lexical_cast<decltype(mySet)::value_type>(*it));

decltype (mySet)::value_type正确。请确保在编译器中启用了C++11模式。如果你有,那么这是一个编译器错误。

一种可能的解决方法包括使用身份元函数:

template <typename T>
struct identity { typedef T type; };
identity<decltype(mySet)>::type::value_type pos;

我会用另一种方法:

typedef std::set<uint_least64_t> set_type;
set_type mySet;
set_type::value_type pos;

下面是打印优先级队列元素的打印方法的一个简单示例:

template<typename T> void print_queue(T& queue) {
    while (!queue.empty()) {
        std::cout << queue.top() << " ";
        queue.pop();
    }
    std::cout << 'n';
}

问题是,在打印完所有元素后,队列是空的。为了将队列恢复到原始状态,我们添加了向量容器。类型从队列中推导出队列元素的数量:

template<typename T> void print_queue(T& queue) {
    std::vector<T::value_type> vec;
    while (!queue.empty()) {
        std::cout << queue.top() << " ";
        vec.push_back(queue.top());
        queue.pop();
    }
    std::cout << 'n';
    for (auto & v : vec) {
        queue.push(v);
    }
}

与其他答案的组合:

template<typename TVariant, typename Tfind>
struct is_variant_of {
    template<typename T1, typename T2> struct var_unfold : public std::false_type {};
    template<typename T1, typename... Tlist> struct var_unfold<T1, std::variant<Tlist...>> 
    { constexpr static bool value = (std::is_same_v<T1, Tlist> || ...); };
    constexpr static bool value = var_unfold<Tfind, TVariant>::value;
};
main() {
    using TV = std::variant<int, double>;
    static_assert(is_variant_of<TV, int>::value);
}
  • template struct var_unfold{}通过部分专用化匹配std::variant<Ts...>
  • 用c++17倍表达的std::is_same_v