17

我知道 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

EDIT3:这有效:

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

4 回答 4

20

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

一种可能的解决方法涉及使用身份元功能:

template <typename T>
struct identity { typedef T type; };

identity<decltype(mySet)>::type::value_type pos;
于 2012-09-12T15:43:24.087 回答
7

我会反过来做:

typedef std::set<uint_least64_t> set_type;
set_type mySet;
set_type::value_type pos;
于 2012-09-12T16:13:55.333 回答
0

结合其他答案:

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...>通过偏特化匹配
  • std::is_same_v与 c++17 折叠表达式一起使用
于 2021-09-02T15:38:17.743 回答
0

这是打印优先级队列元素的打印方法的简单示例:

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);
    }
}
于 2016-12-31T15:21:10.873 回答