繁体   English   中英

从模板 function 内的类型中删除 const-ness

[英]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) );
}

测试: 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));
}

(或者进一步将模板专门用于(非)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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM