のいずれかの表現が、の場合はstd::unique_ptr<T>
であることを静的にアサーションするにはどうすればよいですか。任意のタイプのunique_ptrのstatic_assert
static_assert (std::is_pointer<decltype(exp)>()), "not a smart pointer")
上記は機能しません。真っ直ぐなことがない場合は、bool()
演算子がその型に対して定義されている場合にのみ興味があります。
のいずれかの表現が、の場合はstd::unique_ptr<T>
であることを静的にアサーションするにはどうすればよいですか。任意のタイプのunique_ptrのstatic_assert
static_assert (std::is_pointer<decltype(exp)>()), "not a smart pointer")
上記は機能しません。真っ直ぐなことがない場合は、bool()
演算子がその型に対して定義されている場合にのみ興味があります。
適切な部分特殊で、独自の特性を作成します。
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
{};
上記の例は、 'const'ユニークポインタでは機能しないようです。たとえば、 'is_unique_ptr
あなたはそのための形質を作成することができます。
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));
あなたは、この使用することができます:基本的に
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
と比較します。これは、expr
がstd::unique_ptr
の場合にのみ真となります。
'exp'が' .get'を実装していない場合はどうなりますか? – dashesy
@dashesyそれでもそれでも失敗するでしょう:) – Rakete1111
それは方法で動作します:指定されたアサーションメッセージでのみ動作します – dashesy
最良の答え(現時点では)は 'std :: true_type'などに依存していることに注意してください。これらは今後のC++ 17の一部であり、現在入手可能な 'std :: integral_constant'を使って解を書き直す必要があるかもしれません – StoryTeller
@StoryTeller Huh? 'std :: true_type'はC++ 11以来利用可能です。 'std :: bool_constant'エイリアステンプレートと混同しているかもしれません。 – cpplearner
@cpplearner、あなたは正しいようです。私は3人が手を携えているということを心に残しました。しかたがない。 – StoryTeller