レキシカルキャストが可能な場合にのみ、テンプレートで指定された型にパラメーターを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
が失敗し、失敗しない場合にのみ特殊化されたテンプレートと一致するかどうか?
関数または演算子の存在をテストする例を見たことがありますが、特定の型のテンプレート化された関数を呼び出すとエラーが発生するかどうかをテストすることはありません。