正在从模板函数内部的类型中删除常量

Removing const-ness from a type inside template function

本文关键字:类型 删除 常量 内部 函数      更新时间:2023-10-16
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) );
}

测试:https://ideone.com/L6urU

怎么样:

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));
}

(或者将模板进一步专门用于(非(常量指针。(

这将有效地获取一个指向常量对象的指针,并删除常量,从而使其(foo(能够更改对象。这将与实际暴露的接口不一致,这意味着它在任何类型上都可以平等地(预期地(工作。

不仅如此,它还允许您使用实际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)));
}

无可否认,它相当丑陋。