id:Cryolite:20040911#p4の続き.元記事は↓.
http://lists.boost.org/MailArchives/boost/msg70844.php
詳細については必ず元記事とそこからたどれるpaperを参照してください.
以下のコードはVC++7.1でのみ動作を確認.
#include "concept.h" // 記事中からダウンロードできる #include <vector> #include <utility> #include <iostream> PREPARE_TYPE_CHECKER(iterator); template<class T> void f() { // もしも〜し,Tさんは"iterator"という名前の内部型をお持ちですかぁ? std::cout << CONFORMS( TYPE_IN_CLASS(iterator, T)) << std::endl; } PREPARE_MEMBER_CHECKER(first); template<class T> void g() { // もしも〜し,Tさんは"first"という名前のメンバをお持ちですかぁ? std::cout << CONFORMS( MEMBER_IN_CLASS(first, T)) << std::endl; } int main() { f<int>(); // false f<std::vector<int> >(); // true g<char>(); // false g<std::pair<char, char> >(); // true return 0; }
( ゜∀゜)アハハ八八ノヽノヽノヽノ \ / \/ \
こういう書き方が出来るっていうのはさすがにヤヴァいなぁ.PP+SFINAEですよ.もうやりたい放題.うまく組み合わせたなぁって感心しきり.メンバ関数の有無も調べられるはずなんだけどVC++7.1ではなぜか出来ない.中を少しいじってシグネチャを特定するようにすれば出来るかも.
自由関数が特定のシグネチャに対して提供されているかどうかが判定できたらほぼ文句なしなんだけれど,SFINAE使えないから多分無理だろうな・・・.