代码之家  ›  专栏  ›  技术社区  ›  user32434999

标准库中类似“boost::mpl::identity<T>::type”的非推导上下文?

  •  0
  • user32434999  · 技术社区  · 6 年前

    here on StackOverflow

      template<typename T, typename Pred> 
      T const & clamp ( T const& val, 
        typename boost::mpl::identity<T>::type const & lo, 
        typename boost::mpl::identity<T>::type const & hi, Pred p )
      {
    //    assert ( !p ( hi, lo ));    // Can't assert p ( lo, hi ) b/c they might be equal
        return p ( val, lo ) ? lo : p ( hi, val ) ? hi : val;
      } 
    

    哪里 typename boost::mpl::identity<T>::type 防止编译器根据第二个和第三个参数的类型推断T。这对我来说很方便,但我不能用这个 Boost Library (请不要给我一个困难的时间,因为它已经是一个困难的时间,因为这)。

    3 回复  |  直到 6 年前
        1
  •  3
  •   Barry    6 年前

    C++ 20将拥有 std::type_identity . 但你真的不必等到标准库有了它。其整个实施过程是:

    template< class T >
    struct type_identity {
        using type = T;
    };
    
    template< class T >
    using type_identity_t = typename type_identity<T>::type;
    
        2
  •  2
  •   kmdreko    6 年前

    boost::mpl::identity 是一个相当直接的模板,只提供 type

    它可以实现如下:

    template <typename X>
    struct identity
    {
        typedef X type;
    };
    
        3
  •  0
  •   Justin    6 年前

    std::common_type_t<T> 作品。 From cppreference :

    如果 sizeof...(T) std::common_type<T0, T0>::type 如果存在;否则没有成员类型。

    因此, std::common_type_t 会有用的