仅更改C++模板中某个类型的部分

Mat*_*ner 3 c++ templates type-conversion c++11

抛开目的和疯狂,有没有办法在C++中实现这一目标?

template <typename P>
void Q void_cast(P Q *p) const
{
    return static_cast<P Q *>(p);
}
Run Code Online (Sandbox Code Playgroud)

我试图有效的指针转换为void指针类型,同时保持任何const,restrict和其他预选赛(记Q).

我的印象是C++标准库中有东西(或者不太希望在Boost中),它允许你"调整"类型的属性,比说const_cast或者更精细的粒度static_cast.

Ant*_*ams 7

所以,你想要const X*- > const void*,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;
}
Run Code Online (Sandbox Code Playgroud)

该新型特质之类的东西add_const,add_volatile,remove_constremove_volatile.它们用于以已知方式转换类型的cv限定符,而不是将一种类型的cv限定符应用于另一种类型.

  • @Matt:唯一不那么冗长的方法可能根本就不使用强制转换,因为你无法在单独的模板参数中捕获cv-qualifiers.转换为适当限定的void指针隐式发生,只有C-cast才能删除限定符. (3认同)
  • 在C++中,`T*`将隐式转换为`void*`,但不是相反.必须保留cv-qualifiers,因此`const T*`将隐式转换为`const void*`,而不是`void*`. (3认同)
  • 最终,我认为这些不需要是模板.`void const*void_cast(void const*v){return v; 我相信,和朋友一样. (2认同)