非推导上下文,如标准库中的"boost::mpl::identity:<T>:type"?
Non-deduced context like 'boost::mpl::identity<T>::type' in standard library?
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
将为此工作
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 非推导上下文,如标准库中的"boost::mpl::identity:<T>:type"?
- 如何显式调用运算符<<
- "xvalue has identity"是什么意思?
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- 为什么“操作员”需要const但不是为“运营商&lt;”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 左角支架解释为操作员&lt;而不是模板参数
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型