考虑下面的示例,我挖了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
(请不要为此感到费解,因为它已经很困难了。)
现在的问题是我直接找不到标准库中的等效项?
答案 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
将为此工作