[英]Removing const-ness from a type inside template function
void foo (void *p); // library function; can't edit
template<typename T>
void Remove (T *p)
{
// main code
foo(p); // Can we remove const ness of T here ?
}
我有多个函数,比如Remove()
,它也可以用const T*
调用,这与foo(void*)
不匹配。 如果不重载/专门化Remove()
我可以删除T*
的const
吗? ... 用法:
const int *p;
Remove(p); // error related to `foo()`
如果你真的需要它,这里有一个boost /C++0x 元函数:
template<typename T>
void Remove (T *p)
{
foo( const_cast< typename std::remove_const<T>::type *> (p) );
}
怎么样:
template <typename T>
struct nonconst {
static T& value(T& value) { return value; }
};
template <typename T>
struct nonconst<T const> {
static T& value(T const& value) { return const_cast<T&>(value); }
};
按如下方式使用它:
template<typename T>
void Remove (T* p) {
foo(&nonconst<T>::value(*p));
}
(或者进一步将模板专门用于(非)const 指针。)
这将有效地获取一个指向常量对象的指针,并删除常量,从而使其( foo
)能够改变 object。 这将与实际暴露的接口不一致,这意味着它在任何类型上都同样(并且可以预期)工作。
不仅如此,它还允许您使用实际 const object 的地址来调用它,这将是未定义的行为。
相反,如果绝对需要(并保证 object 不是 const),您应该在调用模板 function之前删除 const 以便它按预期工作(而不是改变 const 类型)。
const A *p;
Remove(const_cast<A*>(p)); // error for `foo()`
您也可以先对const void *
进行static_cast
,然后对void *
* 进行const_cast
:
template<typename T>
void Remove (T *p)
{
foo(const_cast<void*> (static_cast <const void*> (p)));
}
不可否认,它非常丑陋。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.