[英]How to disable pointers as template typenames
當指針用作模板類型名時,我想讓以下 class 無法實例化:
template <typename T>
class MyClass{
//...
T payload;
//...
};
所以MyClass<int>
很好,但MyClass<int*>
不是。
如果我可以用一個包含指針的struct
來禁止 class 的實例化,那就太好了。
有幾種方法可以做到這一點。 您可以使用SFINAE將模板限制為非指針類型,例如
template <typename T, std::enable_if_t<!std::is_pointer_v<T>, bool> = true>
class MyClass{
//...
T payload;
//...
};
但這會給一些很難理解的編譯器錯誤。 使用static_assert
您可以添加自己的自定義錯誤消息,例如
template <typename T>
class MyClass {
//...
static_assert(!std::is_pointer_v<T>, "MyClass<T> requires T to be a non pointer type");
T payload;
// ...
};
您可以使用static_assert
+ std::is_pointer_v
:
template <typename T>
class MyClass {
static_assert(!std::is_pointer_v<T>);
// ...
};
如果您沒有 C++11 來使用std::is_pointer
和static_assert
,您可以定義一個特化並將其保留為未定義:
template <typename T>
class MyClass {
};
template<class T>
class MyClass<T*>; // Requires non-pointer types
template<class T>
class MyClass<T* const>; // Requires non-pointer types
template<class T>
class MyClass<T* const volatile>; // Requires non-pointer types
template<class T>
class MyClass<T* volatile>; // Requires non-pointer types
int main() {
MyClass<int> mc1; // Works fine
MyClass<int*> mc2; // Error
}
如果我可以用一個包含指針的結構來禁止 class 的實例化,那就太好了。
這在 C++ 中是不可能的。
請注意,智能指針是其中包含指針的結構; std::is_pointer 無法識別它們,因此如果要禁止它們,則需要提供單獨的元函數(不是很難)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.