在 C++ 中,std::decay
是一個模板元函數,它可以將給定的類型轉換為其對應的非引用、非 cv-qualified(即非 const/volatile 限定)類型。這對于實現類型擦除非常有用,因為它允許我們存儲和操作各種類型的對象,而無需知道它們的確切類型。
下面是一個使用 std::decay
實現類型擦除的示例:
#include<iostream>
#include <type_traits>
#include <utility>
template<typename T>
class TypeErasedWrapper {
public:
template<typename U>
TypeErasedWrapper(U&& value)
: _value(new ValueWrapper<typename std::decay<U>::type>(std::forward<U>(value))) {}
// ... 其他成員函數,如析構函數、拷貝/移動構造函數和賦值運算符等
private:
class ValueWrapperBase {
public:
virtual ~ValueWrapperBase() = default;
// ... 其他虛函數,用于實現類型擦除的接口
};
template<typename U>
class ValueWrapper : public ValueWrapperBase {
public:
ValueWrapper(U&& value) : _value(std::forward<U>(value)) {}
// ... 實現 ValueWrapperBase 中的虛函數
private:
U _value;
};
std::unique_ptr<ValueWrapperBase> _value;
};
int main() {
TypeErasedWrapper<int> wrapper1 = 42;
TypeErasedWrapper<double> wrapper2 = 3.14;
// ... 使用類型擦除的對象
return 0;
}
在這個示例中,我們創建了一個名為 TypeErasedWrapper
的類,它使用 std::decay
來實現類型擦除。我們還定義了一個基類 ValueWrapperBase
和一個模板派生類 ValueWrapper
,用于存儲和操作各種類型的對象。通過這種方式,我們可以在不知道具體類型的情況下,處理各種類型的對象。