Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅更改C+;中类型的部分+;模板 撇开目的和疯狂,C++有没有办法实现? template <typename P> void Q void_cast(P Q *p) const { return static_cast<P Q *>(p); } 模板 空心Q空心_铸件(P Q*P)常数 { 返回静态投影(P); }_C++_Templates_C++11_Type Conversion - Fatal编程技术网

仅更改C+;中类型的部分+;模板 撇开目的和疯狂,C++有没有办法实现? template <typename P> void Q void_cast(P Q *p) const { return static_cast<P Q *>(p); } 模板 空心Q空心_铸件(P Q*P)常数 { 返回静态投影(P); }

仅更改C+;中类型的部分+;模板 撇开目的和疯狂,C++有没有办法实现? template <typename P> void Q void_cast(P Q *p) const { return static_cast<P Q *>(p); } 模板 空心Q空心_铸件(P Q*P)常数 { 返回静态投影(P); },c++,templates,c++11,type-conversion,C++,Templates,C++11,Type Conversion,我试图有效地将指针强制转换为void指针类型,同时保留任何const、restrict和其他限定符(由Q表示) 我在印象中有C++标准库中的东西(或者不太理想,在Boost中),允许您“调整”属性的类型,粒度比“代码> > conconsCAST 或 StasyType Studio 。因此,您需要 const x* >代码> const Value*/Cuth>volatile X*->volatile void*等 您可以通过一组重载来实现这一点: template<typename

我试图有效地将指针强制转换为
void
指针类型,同时保留任何
const
restrict
和其他限定符(由
Q
表示)


<>我在印象中有C++标准库中的东西(或者不太理想,在Boost中),允许您“调整”属性的类型,粒度比“代码> > conconsCAST 或 StasyType Studio

。因此,您需要<代码> const x*<代码> >代码> const Value*/Cuth>

volatile X*
->
volatile void*

您可以通过一组重载来实现这一点:

template<typename P>
void* void_cast(P* p)
{
    return p;
}

template<typename P>
void const* void_cast(P const* p)
{
    return p;
}

template<typename P>
void volatile* void_cast(P volatile* p)
{
    return p;
}

template<typename P>
void const volatile* void_cast(P const volatile* p)
{
    return p;
}
模板
void*void\u铸件(P*P)
{
返回p;
}
模板
无效常数*无效系数(P常数*P)
{
返回p;
}
模板
void volatile*void_cast(P volatile*P)
{
返回p;
}
模板
void const volatile*void_cast(P const volatile*P)
{
返回p;
}

新的类型特征有
add_const
add_volatile
remove_const
remove_volatile
。它们用于以已知方式转换类型的cv限定符,而不是将一种类型的cv限定符应用于另一种类型。

在boost type traits库中有一些用于删除限定符的工具


你已经明确了我的目标,并解释了类型特征与之之间的关系。我仍然希望有一种不太详细的方法来实现这一点。@马特:唯一不太详细的方法可能是根本不使用强制转换,因为您无法在单独的模板参数中捕获cv限定符。转换到适当限定的void指针是隐式的,只有C-cast可以删除限定符。最终,我认为这些不需要是模板<代码>void const*void_cast(void const*v){return v;}我相信,朋友就足够了。可能吧。这些模板需要一个指针,而不需要一个隐式转换为指针的类,除非指定指针类型(例如,代码> VoIDyCaseX(x)<代码>),或者首先将类型转换为指针(例如,<代码> VoIDySCAPE((y*)x)< />代码>,而普通函数将接受隐式转换到参数类型。C++中,
T*
将隐式转换为
void*
,但不是相反。cv限定符必须保留,因此
const T*
将隐式转换为
const void*
,而不是
void*
。记住模板不仅仅是文本替换;一些模板参数T可以是int[3],函数参数T¶m可以是对数组的引用。
template<class From>
typename copy_rpcv<void, From*>::type void_cast(From *p) {
  return p;  // implicit conversion works
}
// "copy ref/pointer/const/volatile"
template<class To, class From>
struct copy_rpcv {
  typedef To type;
};
template<class To, class From> struct copy_rpcv<To, From&        > { typedef typename copy_rpcv<To, From>::type&         type; };
template<class To, class From> struct copy_rpcv<To, From*        > { typedef typename copy_rpcv<To, From>::type*         type; };
template<class To, class From> struct copy_rpcv<To, From const   > { typedef typename copy_rpcv<To, From>::type const    type; };
template<class To, class From> struct copy_rpcv<To, From volatile> { typedef typename copy_rpcv<To, From>::type volatile type; };
template<class To, class From> struct copy_rpcv<To, From* restrict> { typedef typename copy_rpcv<To, From>::type* restrict type; };
int *const *const p = 0;
void *const *const v = void_cast(p);