ここでは、テンプレートメタプログラミングのビットです。 is_template_instance
は、型と型を取るテンプレートをとり、その第2型が最初のテンプレートのインスタンスであれば真を返します。
template<template<class...>class Z, class T>
struct is_template_instance:std::false_type{};
template<template<class...>class Z, class...Ts>
struct is_template_instance<Z,Z<Ts...>>:std::true_type{};
ここで、イテレータの値の型を照会する必要があります。 is_point_iterator
テンプレートの書き込みに私たちは、上記の2を構成
template<class It>
using it_value_type = typename std::iterator_traits<It>::value_type;
::私たちは、直接std::iterator_traits
を使用するか、またはこのようなエイリアスを使用することができます
が
template<class It>
using is_point_iterator = is_template_instance< Point, it_value_type<It> >;
注意をあなたはこの非イテレータを渡した場合、それはかもしれないことまたは、間違った結果を返す可能性があります(std::iterator_traits
は、イテレータ以外の場合の合理的な戻り値を保証しません)。
しかし、それはテンプレート本体で捕捉される傾向があります。
template<class PointIterator,
class=std::enable_if_t< is_point_iterator<PointIterator>::value >
>
void functionThatOperatesOnPointSequence(PointIterator begin, PointIterator end) {
// ...
}
有用性には限りがあります。
次の例のように、より多くのSFINAEに優しい方法でPointIteratorからの値型を抽出できます。
template<class It>
using it_value_type = std::decay_t<decltype(*std::declval<It>())>;
あなたはSFINAEのサポートが必要な場合。
あなたは何かを作成しましたか?それはスタックのオーバーフローなので、あなたは何らかの努力をしたということを質問する必要があります。準備が整った解決策を求めないでください。 – sebap123
'PointIterator :: operator *'は、1種類のオブジェクトだけを返すことができます。 'PointIterator'はおそらくテンプレートの引数でなければなりません。 – user2079303
is_a_point> :: value'? –
Jarod42