2016-06-22 11 views
5

のいずれかの表現が、の場合はstd::unique_ptr<T>であることを静的にアサーションするにはどうすればよいですか。任意のタイプのunique_ptrのstatic_assert

static_assert (std::is_pointer<decltype(exp)>()), "not a smart pointer") 

上記は機能しません。真っ直ぐなことがない場合は、bool()演算子がその型に対して定義されている場合にのみ興味があります。

+0

最良の答え(現時点では)は 'std :: true_type'などに依存していることに注意してください。これらは今後のC++ 17の一部であり、現在入手可能な 'std :: integral_constant'を使って解を書き直す必要があるかもしれません – StoryTeller

+2

@StoryTeller Huh? 'std :: true_type'はC++ 11以来利用可能です。 'std :: bool_constant'エイリアステンプレートと混同しているかもしれません。 – cpplearner

+0

@cpplearner、あなたは正しいようです。私は3人が手を携えているということを心に残しました。しかたがない。 – StoryTeller

答えて

6

適切な部分特殊で、独自の特性を作成します。

template <class T> 
struct is_unique_ptr : std::false_type 
{}; 

template <class T, class D> 
struct is_unique_ptr<std::unique_ptr<T, D>> : std::true_type 
{}; 
+0

上記の例は、 'const'ユニークポインタでは機能しないようです。たとえば、 'is_unique_ptr > :: value'はfalseです。 – camelCase

3

あなたはそのための形質を作成することができます。

template <typename T, typename D> 
std::true_type is_unique_ptr_impl(const std::unique_ptr<T, D>&, int); 

template <typename T> 
std::false_type is_unique_ptr_impl(const T&, ...); 

template <typename T> 
using is_unique_ptr = decltype(is_unique_ptr_impl(std::declval<T>(), 0)); 
1

あなたは、この使用することができます:基本的に

static_assert(std::is_same<decltype(expr), 
    std::unique_ptr<std::remove_pointer<decltype(expr.get())>::type>>::value, ""); 

を、それはstd::unique_ptr::get()からタイプのうちstd::unique_ptrを作成し、それをexprと比較します。これは、exprstd::unique_ptrの場合にのみ真となります。

+0

'exp'が' .get'を実装していない場合はどうなりますか? – dashesy

+0

@dashesyそれでもそれでも失敗するでしょう:) – Rakete1111

+0

それは方法で動作します:指定されたアサーションメッセージでのみ動作します – dashesy

関連する問題