[英]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.