标准库中的非推导上下文,例如'boost :: mpl :: identity <t> :: type'?

时间:2018-09-08 23:57:00

标签: c++ c++17 c++-standard-library type-deduction

考虑下面的示例,我挖了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 个答案:

答案 0 :(得分:3)

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;

答案 1 :(得分:2)

boost::mpl::identity是一个相当简单的模板,仅提供与提供的模板参数相同的type

它可以实现如下:

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

答案 2 :(得分:0)

std::common_type_t<T>有效。 From cppreference

  

如果sizeof...(T)是一个(即T ...仅包含一种类型T0),则成员类型的名称与std::common_type<T0, T0>::type相同;否则没有成员类型。

因此,std::common_type_t将为此工作