17

value_type、key_type ...については知っていますが、インスタンスではなく型で動作します。私は次のようなものを試しました:

std::set<uint64_t> mySet;   

decltype (mySet)::value_type pos;

しかし、それは機能しません。

編集:私はVS2010を使用しています。

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モードが有効になっていることを確認してください。持っている場合、それはコンパイラのバグです。

考えられる回避策には、IDメタ関数の使用が含まれます。

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

優先キューの要素を出力するprintメソッドの簡単な例を次に示します。

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 に答える
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_vc++17フォールド式での使用
于 2021-09-02T15:38:17.743 に答える