簡體   English   中英

如何禁用指針作為模板類型名

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM