以下のコードにおいて、has_iteratorはその型がメンバにイテレータを持っているか調べる構造体です。
has_iteratorはhas_iterator_implを継承していますが、実際に外で使われるものはhas_iteratorのみでimplが使われることは想定しておりません。
ユーザーが不用意にimplを使用してしまわないように外からはアクセスができないようにしてしまいたいのですが、何か良い方法はありますか。
Cpp
1// has_iterator.hpp------------------------------ 2#pragma once 3#include <type_traits> 4 5// 外から丸見えなのをどうにかしたい 6struct has_iterator_impl { 7 template <class T> 8 static std::true_type check(typename T::iterator*); 9 10 template <class T> 11 static std::false_type check(...); 12}; 13 14// 実際に使われる方 15template <class T> 16struct has_iterator : public decltype(has_iterator_impl::check<T>(nullptr)) {}; 17
Cpp
1// main.cpp-------------------------------------- 2#include <iostream> 3#include <vector> 4#include "has_iterator.hpp" 5 6int main() { 7 using ivector = std::vector<int>; 8 static_assert(has_iterator<ivector>::value, "vector has iterator"); 9 static_assert(has_iterator<int>::value, "int has not iterator"); 10 11 return 0; 12}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/20 01:58
2019/06/20 02:02