簡體   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