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

Non-deduced context like 'boost::mpl::identity<T>::type' in standard library?

本文关键字:lt identity type gt mpl 上下文 标准 boost      更新时间:2023-10-16

Cosider 我在 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(请不要让我为此感到困难,因为因此已经很难了(。

现在的问题是,标准库中是否有我找不到的直接等效的东西?

> 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;

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

它可以按如下方式实现:

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

std::common_type_t<T>有效。从 cpp 首选项:

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

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