主にデバッグの目的でstdコンテナのストリーム演算子を記述しようとしています。std :: set SFINAEの問題でis_containerの特性が失敗する
I持って次のコード:
#include <type_traits>
#include <iostream>
#include <ostream>
#include <iterator>
#include <algorithm>
#include <functional>
#include <vector>
#include <set>
#include <deque>
template<typename Container>
struct is_container
{
typedef char no;
typedef long yes;
template<typename A, A, A>
struct is_of_type;
template<typename T>
static yes& is_cont(
is_of_type
<
typename T::iterator(T::*)(),
&T::begin,
&T::end
>*);
template<typename T>
static no& is_cont(...); //any other
template<typename C, bool B>
struct is_class_is_container
{
const static bool value=sizeof(is_cont<C>(nullptr))==sizeof(yes);
};
template<typename C>
struct is_class_is_container<C, false>
{
const static bool value=false;
};
const static bool value = is_class_is_container
<
Container,
std::is_class<Container>::value
>::value;
};
template<typename T>
typename std::enable_if
< is_container<T>::value, std::ostream >::type&
operator<<(std::ostream& os, const T& a)
{
os << '[';
std::copy(a.begin(), a.end(), std::ostream_iterator<typename T::value_type>(os, ", "));
os << ']';
return os;
}
私は、これは(建設的なコメントが感謝)完璧にはほど遠いです承知していますが、私が午前問題は、それがベクトル、両端キューおよびリストのために素晴らしい作品が、に失敗したということですなぜなら、セットにはイテレータのインターフェイスがまだ開始され、終了しているからです。
ありがとうございました。
EDIT: グラム上でテスト++(GCC)4.6.2 2012012 打ち鳴らすバージョン3.0
EDIT2:今、私はそれがないと主張することはできませんので、私はそれが一種のdecltypeを使用して作業してしまったしかしそれがサブ最適です私が期待するもの(イテレータを返す)。
私は、セットが最初に戻ってきたことを正確には知りません。もし誰かがTMPをデバッグする方法を持っていれば、それは良いでしょう。
私は[プリティプリンタ](http://stackoverflow.com/questions/4850473/pretty-print-cで 'is_container'形質のいくつかのフォームを持っています-stl-containers)を使用してください。 –
@KerrekSBありがとう、私はそれを見ていきますが、これは実際に私がこのようなものを得るテストであるので、私はそれを正確に行い、それを働かせようとします。 – 111111
これは不要です。これを試してみてください:http://ideone.com/gBx6P –