私は現在、いくつかのテンプレートメタプログラミングを行っています。私の場合、私は任意の "反復可能な"型、すなわちtypedef foo const_iterator
が同じ方法で存在する任意の型を扱うことができます。私はこれに新しいC++ 11テンプレートメタプログラミングを使用しようとしていましたが、特定の型が見つからないかどうかを検出する方法が見つかりませんでした。コンパイル時にtypedefを検出する(テンプレートメタプログラミング)
他の特性に基づいて他のテンプレートの特殊化をオン/オフする必要があるため、現在2つのパラメータを持つテンプレートを使用しています.2つ目はstd::enable_if
で生成されます。ここで私は現在やっているものです:
template <typename T, typename Enable = void>
struct Foo{}; // default case is invalid
template <typename T>
struct Foo< T, typename std::enable_if<std::is_fundamental<T>::value>::type>{
void do_stuff(){ ... }
};
template<typename T>
struct exists{
static const bool value = true;
};
template<typename T>
struct Foo<T, typename std::enable_if<exists< typename T::const_iterator >::value >::type> {
void do_stuff(){ ... }
};
私はexists
ヘルパーテンプレートせずにこのような何かを行うことができませんでした。たとえば、この特殊化を使用する必要がある場合、無効なデフォルトのケースがインスタンス化されたため、単に
template<typename T>
struct Foo<T, typename T::const_iterator> {
void do_stuff(){ ... }
};
が機能しませんでした。
しかし、このexists
は新しいC++ 11標準のどこにも見つかりませんでした。私が知っている限り、この種のものはboost::type_traits
から取っています。しかし、のboost::type_traits
には、代わりに使用できるものは何も表示されていません。
この機能が欠落しているか、目的の動作を達成するための他の明白な方法を見落としましたか?
これは、あなたの質問へのリンクを投稿する必要があります。 :)また、あなたはこれを好きに思っているようですが、あなたはそれを複数回提案しています。 – Xeo
@ Xeo、はいこれはかなり簡単で簡単です。しかし、私はあなたの最初の部分を取得していない 'あなたは多分この1つの作品のあなたの質問へのリンクを投稿する必要があります。' :)あなたは答えている間私は私の以前の質問(コードそれ自体)?私はそれが推奨されていないと思う。 – iammilind
Nono、私が言ったのは、あなたが[あなたの質問にどのように尋ねたところであなたの質問へのリンクを投稿する]ことです(http://stackoverflow.com/questions/6543652/different-template-syntax-for-finding-if-argument)。 -is-a-class-or-not)、それは最初は本当に明白ではないからです。 Woops、そして私はちょうど私が「質問」を書いたことを指摘しました。 – Xeo