4

レキシカルキャストが可能な場合にのみ、テンプレートで指定された型にパラメーターをboost::lexical_castキャストするために使用するメソッドを提供するために使用しているテンプレート化されたクラスがあります。現在、可能かどうかを確認するために、問題のタイプに対して が定義されているstd::stringかどうかを確認しているだけです。operator>>これは、私がやっていることを基本的に説明する不自然な例です:

template <typename ArgType, class Enable = void>
MyHelperClass
{
   void Foo (ArgType arg&, std::string strArg) { } // not castable; do nothing
};

template <typename ArgType>
MyHelperClass<ArgType, boost::enable_if<boost::has_right_shift<std::istream, ArgType> >::type>
{
   void Foo (ArgType arg&, std::string strArg) {
      arg = boost::lexical_cast<ArgType>(strArg); // cast string arg to ArgType
   }
};

これまでのところ、これは私のコードでは問題なく機能します。レキシカル キャストに失敗するすべての型は最初のバージョンになり、他のすべての型は 2 番目のバージョンになります。少なくとも、コードでこれを使用している型についてはそうです。私が心配しているのは、基本的に、ターゲットの型が InputStreamable である限り、lexical_cast が失敗しないという仮定を立てていることです。lexical_castのブースト ドキュメントenable-ifには、他のいくつかの要件が概説されています。おそらくこれもチェックする必要がありますが、複雑なものを作成してこれらの条件をまとめて使用するのではなくmpl::and_、SFINAE を使用して直接テストする方法はありますか?指定された型に対してその呼び出しlexical_castが失敗し、失敗しない場合にのみ特殊化されたテンプレートと一致するかどうか?

関数または演算子の存在をテストする例を見たことがありますが、特定の型のテンプレート化された関数を呼び出すとエラーが発生するかどうかをテストすることはありません。

4

1 に答える 1

1

そうではないと思います。すべての T に対して lexical_cast が定義されているため、SFINAE は役に立ちません。lexical_cast() の本体が特定の型のコンパイルに失敗するという事実は、置換の失敗を引き起こしません。あなたができる最善のことは、あなたがすでに行ってきたように、体が機能しなくなる原因となる条件を予測しようとすることです.

于 2012-01-12T05:49:21.353 に答える