我想在C++ 11中重載std::is_pointer
以產生std::shared_ptr<T>
也是如此,因爲後者的行爲非常像T*
。C++ 11:將std :: is_pointer擴展到std :: shared_ptr
#include <type_traits>
namespace std {
template <typename T> struct is_pointer<shared_ptr<T>> : std::true_type {};
template <typename T> struct is_pointer<shared_ptr<T const>> : std::true_type {};
}
我想知道爲什麼這個過載還沒有包含在標準實現中。有沒有我忽略的陷阱?
作爲替代方案當然可以引入一個新的特點is_shared_ptr<T>
。
其實,我嘗試下面的代碼在首位:
template <typename T>
struct is_pointer<shared_ptr<typename std::remove_cv<T>::type>>
: std::true_type
{};
不與GCC 4.7編譯由於
error: template parameters not used in partial specialization:
error: ‘T’
''is_pointer'在模板編程中很有用,當我想知道某些東西是否是原始指針類型,而不僅僅是指針。如果'* p'和'++ p'是有效的表達式,你可以實現一個'is_like_ptr',它執行類似SFINAE的測試。 – aschepler
@aschepler:智能指針通常不支持算術。 'is_dereferencable',只是檢查'* p',可能更合適。 –
好點。我覺得我還沒有醒過來。 – aschepler